【问题标题】:Id could not be found in Datalist on click of upload button单击上传按钮时在 Datalist 中找不到 ID
【发布时间】:2017-11-23 10:34:40
【问题描述】:

我有一页正在使用更新面板、数据列表和文件上传。 我正在使用 Visual Studio 2010

我的文件上传在数据列表中,我正在将数据列表与动态表绑定以重复文件上传控制。

请看下面的布局图:

这里主要的红色高亮边框显示重复的数据列表,并且我有文件上传控制。

现在数据列表在更新面板中,因此文件上传无法正常工作所以在数据列表中我采取了另一个更新面板来使文件上传工作,这也可以正常工作,但点击绿色添加按钮问题开始出现

找不到 ID 为“Upload”的控件用于触发器 UpdatePanel 'UpdatePanel1'。

以下是我的 html 代码,请记住我只是给出出现问题的部分:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="Uppanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:DataList ID="dtcustomerregistration" runat="server" RepeatDirection="Vertical"
            Width="100%" OnItemCommand="dtcustomerregistration_ItemCommand">
            <ItemTemplate>
                <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                    <ContentTemplate>
                        <label class="col-md-4 control-label" for="Pic">
                            Upload Image:</label>

                        <asp:FileUpload ID="Pic" runat="server" accept="image/gif, image/jpg, image/jpeg, image/png" />

                        <asp:Button ID="Upload" CommandArgument='<%#Eval("uniqueId") %>' CommandName="Edit"
                            runat="server" Text="Upload" OnClick="Upload_Click" />
                        <asp:Label ID="StatusLabel" runat="server" CssClass="requiredvalidate" Text=""></asp:Label>
                        <asp:HiddenField ID="hdimagename" runat="server" Value='<%#Eval("UploadImage") %>' />

                        <asp:Image ID="imgpicuploaded" runat="server" ImageUrl='<%#System.Configuration.ConfigurationManager.AppSettings["ShowImagetemppath"].ToString().Replace("~/","") +Eval("UploadImage").ToString() %>'
                            Height="50px" />
                        </div>
                    </ContentTemplate>
                    <Triggers>
                        <asp:PostBackTrigger ControlID="Upload" />
                    </Triggers>
                </asp:UpdatePanel>
            </ItemTemplate>
        </asp:DataList>
        <asp:ImageButton ID="imgplus" runat="server" ImageUrl="~/Image/Add.png" Height="50px" OnClick="imgplus_Click" />
    </ContentTemplate>
</asp:UpdatePanel>

我的imgplus点击事件代码如下。

protected void imgplus_Click(object sender, ImageClickEventArgs e)
{
int n = (int)ViewState["n"];
n = n + 1;
BindData(n);
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState["data"] = null;
BindData(0);
}
}
public void BindData(int n)
{
DataTable dt = new DataTable();
dt.Columns.Add("uniqueId");
dt.Columns.Add("Invoice");
dt.Columns.Add("ReturnType");
dt.Columns.Add("ItemNumber");
dt.Columns.Add("ReturnQTY");
dt.Columns.Add("UnitofMeasure");
dt.Columns.Add("CreditPer");
dt.Columns.Add("ReasonCode");
dt.Columns.Add("InvoiceNumber");
dt.Columns.Add("Ordernumber");
dt.Columns.Add("Notes");
dt.Columns.Add("UploadImage");

if (ViewState["data"] == null)
{
dt = bindemptydata(dt, n);
}
else
{
foreach (DataListItem dli in dtcustomerregistration.Items)
{
HiddenField lblid = (HiddenField)dli.FindControl("lblid");
DropDownList RetCred = (DropDownList)dli.FindControl("RetCred");
DropDownList returntype = (DropDownList)dli.FindControl("returntype");
TextBox ItemNumber = (TextBox)dli.FindControl("ItemNumber");
TextBox ReturnQty = (TextBox)dli.FindControl("ReturnQty");
DropDownList Unit = (DropDownList)dli.FindControl("Unit");
TextBox Credit = (TextBox)dli.FindControl("Credit");
DropDownList ReasonCode = (DropDownList)dli.FindControl("ReasonCode");
TextBox Invoice = (TextBox)dli.FindControl("Invoice");
TextBox OrderNumber = (TextBox)dli.FindControl("OrderNumber");
TextBox Notes = (TextBox)dli.FindControl("Notes");
Image imgpicuploaded = (Image)dli.FindControl("imgpicuploaded");
HiddenField hdimagename = (HiddenField)dli.FindControl("hdimagename");
DataRow dr = dt.NewRow();

if (lblid.Value != "")
{
dr["uniqueId"] = lblid.Value;
}
else
{
dr["uniqueId"] = n;
}
dr["Invoice"] = RetCred.SelectedValue;
dr["ReturnType"] = returntype.SelectedValue;
dr["ItemNumber"] = ItemNumber.Text;
dr["ReturnQTY"] = ReturnQty.Text;
dr["UnitofMeasure"] = Unit.SelectedValue;
dr["CreditPer"] = Credit.Text;
dr["ReasonCode"] = ReasonCode.SelectedValue;
dr["InvoiceNumber"] = Invoice.Text;
dr["Ordernumber"] = OrderNumber.Text;
dr["Notes"] = Notes.Text;
dr["UploadImage"] = hdimagename.Value;
dt.Rows.Add(dr);
}

dt = bindemptydata(dt, n);
}
BindDatalist(dt);
ViewState["n"] = n;
}

public DataTable bindemptydata(DataTable dt, int n)
{
DataRow dr = dt.NewRow();
dr["uniqueId"] = n;
dr["Invoice"] = "Credit";
dr["ReturnType"] = "0";
dr["ItemNumber"] = "";
dr["ReturnQTY"] = "";
dr["UnitofMeasure"] = "Each";
dr["CreditPer"] = "100%";
dr["ReasonCode"] = "0";
dr["InvoiceNumber"] = "";
dr["Ordernumber"] = "";
dr["Notes"] = "";
dr["UploadImage"] = "";
dt.Rows.Add(dr);

return dt;
}
public void BindDatalist(DataTable dt)
{
dtcustomerregistration.DataSource = dt;
dtcustomerregistration.DataBind();// Here I am receiving error
ViewState["data"] = dt;
}    

在上面我给出了创建动态数据表并将其与数据列表绑定的完整代码,以便在单击imgplus 按钮时重复数据列表 但是单击按钮时,我收到错误消息:

下面是错误图片。

我该如何解决这个问题?

单击Imgplus 按钮我收到了DataList 中存在的上传按钮的问题。

还有一件事,如果我通常单击 ImgPlus 按钮而不使用上传按钮单击,那么它将重复 DataList 控件而不会出现任何问题,但如果我使用上传单击按钮存在于 DataList 中,然后单击Imgplus 按钮后,我收到错误消息:

找不到 ID 为“Upload”的控件用于触发器 UpdatePanel 'UpdatePanel1'。

【问题讨论】:

  • 您是否尝试过检查您呈现的 HTML 代码以确保您的按钮具有您认为的 ID?首先检查一下,可以帮助你。
  • 这里有上传id
  • 您的渲染代码,而不是您的设计器代码。运行您的解决方案并使用 Chrome 开发工具(例如)检查您的 DOM 元素。
  • 因为更新面板在那里它改变了上传按钮的ID所以我该如何解决这个问题
  • 在这种情况下,还有 2 个更新面板,一个在 datalist 内,第二个在 datalist 外

标签: c# asp.net updatepanel datalist


【解决方案1】:

用另一个 UpdatePanel upButton 包围您的按钮:

<asp:UpdatePanel ID="upButton" runat="server" UpdateMode="Conditional">
    <asp:Button ID="Upload" CommandArgument='<%#Eval("uniqueId") %>' CommandName="Edit"
        runat="server" Text="Upload" OnClick="Upload_Click" />
</ContentTemplate>

然后在您的按钮单击方法Upload_Click 中调用您的主UpdatePanel Uppanel.Update();

注意:删除 UpdatePanel ID="UpdatePanel1"

【讨论】:

  • 但我在 img plus 按钮上遇到问题
  • 简单地试试那个按钮
  • 好的,我会尝试并让您知道但请确保您正确阅读了我的问题并准备好我的问题我收到错误,因为在 UpdatePanel 中找不到触发器的 ID 为“Upload”的控件更新面板1
  • 我已经尝试过你所说的但同样的问题来了,问题出在 imgplus 按钮上而不是上传按钮上
【解决方案2】:

你的错误是因为这段代码而发生的:

<Triggers>
         <asp:PostBackTrigger ControlID="Upload" />
</Triggers>

您在嵌套面板中使用了PostBackTrigger,而您应该使用 AsyncPostBackTrigger 在这种情况下根据 this 页面。

所以将该代码段更改为:

<Triggers>
         <asp:AsyncPostBackTrigger ControlID="Upload" />
</Triggers>

或将UpdatePanel1UpdateMode 设置为"Always"

【讨论】:

  • 关于设置 AsyncPostBackTrigger 上传控件上的文件不会被找到
  • 您是否尝试删除 UpdatePanel1 并将触发器设置为 AsyncPostBackTrigger?.. 您将嵌套的 UpdatePanel1 放置在同步 PostBackTrigger 的首位。我试图复制该错误但没有成功,但是我注意到当我选择 PostBackTrigger 时设计者没有注意到上传按钮 + 我发布的链接指出了有关嵌套更新面板和 PostBackTrigger 的一些内容。
  • 实际上我正在开发 Visual Studio 2010,它给出了当前的问题。当我将此代码复制到 Visual Studio 2015 时,它工作正常,所以我认为我的问题是版本控制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多