【问题标题】:Multiple controls with the same ID were found发现多个具有相同 ID 的控件
【发布时间】:2012-04-02 07:35:04
【问题描述】:

我有以下 asp.net 代码,但是当我更改下拉选择的索引时它会出错:

<asp:UpdatePanel>
      <ContentTemplate>
        <asp:DropDownList ID="drp" runat="server" AutoPostBack="true" OnSelectedIndexChanged="drp_SelectedIndexChanged">
          <asp:ListItem Text="ABC" Value="ABC"></asp:ListItem>
          <asp:ListItem Text="DEF" Value="DEF"></asp:ListItem>
        </asp:DropDownList>
        <asp:Panel ID="pnl" runat="server">
        </asp:Panel>
        <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" />
      </ContentTemplate>
      <Triggers>
        <asp:PostBackTrigger ControlID="drp" />
        <asp:PostBackTrigger ControlID="Button1" />
      </Triggers>
    </asp:UpdatePanel>

现在制作了一个函数来创建文本框并将文本框值按以下方式获取到标签中

protected void drp_SelectedIndexChanged(object sender, EventArgs e)

{
  if (drp.SelectedIndex != 0)
  {
    ViewState["controls"] = true;
    CreateTextbox(drp.SelectedIndex);
  }

}

private void CreateTextbox(int Number)
{
  try
  {
    TextBox txtTextbox;
    Label lbltxtTextbox;
    for (int i = 0; i < Number; i++)
    {
      txtTextbox = new TextBox();
      txtTextbox.ID = "txtbox" + i;
      lbltxtTextbox = new Label();
      lbltxtTextbox.ID = "lbltxtbox" + i;
      pnl.Controls.Add(txtTextbox);
      pnl.Controls.Add(lbltxtTextbox);
    }
  }
  catch (Exception ex)
  {
  }
}

private void GetTextboxvalue(int Number)
{
  try
  {
    TextBox txtTextbox;
    Label lbltxtTextbox;
    for (int i = 0; i < Number; i++)
    {
      txtTextbox = (TextBox)pnl.FindControl("txtbox" + i);
      lbltxtTextbox = (Label)pnl.FindControl("lbltxtbox" + i);
      lbltxtTextbox.Text = txtTextbox.Text;
    }
  }
  catch (Exception ex)
  {
  }
}

protected void Button1_Click(object sender, EventArgs e)
{
  GetTextboxvalue(drp.SelectedIndex);
}
protected void Page_Load(object sender, EventArgs e)
{

  if (ViewState["controls"] != null)
    if (drp.SelectedIndex != 0)
    {
      CreateTextbox(drp.SelectedIndex);
    }



}

错误是:

Multiple controls with the same ID 'txtbox0' were found. FindControl requires that controls have unique IDs.

【问题讨论】:

  • 从您的浏览器查看 html 源代码,这将帮助您找到所有呈现的控件。
  • 如果您将下拉列表两次更改为相同的项目,您会创建两次相同的文本框,因此您最终会得到相同的 id。
  • 根据你真正想做的事情,也许你应该调用 pnl.Controls.Clear() 作为你的 try 块的第一个语句。

标签: asp.net


【解决方案1】:

GUID

更改以下行

txtTextbox.ID = "txtbox" + sequentialId;

到下一行

txtTextbox.ID = "txtbox" + Guid.NewGuid().ToString("N");

您可以在其余地方采用相同的方法。

【讨论】:

  • 你拯救了我的一天!非常感谢
【解决方案2】:

我已找到以下解决您遇到的错误的方法。

drp_SelectedIndexChangedSelectedIndexChanged 上触发并且它是not zero index 时,您会收到错误“找到具有相同 ID 'txtbox0' 的多个控件。FindControl 要求控件具有唯一 ID。” when index 1 is selected for more then one times.

改变

if (drp.SelectedIndex != 0) statement 

if (drp.SelectedIndex != 0 && ViewState["controls"] != null)

【讨论】:

    【解决方案3】:

    当缺少任何控件 ID 或多个控件分配了相同的 ID 时,会发生此错误。要消除此错误,请使每个控件的 ID 值唯一。

    见下例,循环增量值j动态附加到id值上,使id值递增

    pnl.ID = "pnltype" + j.ToString();

    for (int j = 0; j < dtRtype.Rows.Count; j++)
    {        
      pnl = new Panel();
      pnl.Width = panelWidth;
      pnl.Height = panelHeight;
      pnl.BackColor = Color.BlueViolet;
      pnl.BorderStyle = BorderStyle.Solid;
      pnl.BorderColor = System.Drawing.Color.White;
      pnl.BorderWidth = 2;
      pnl.Style["position"] = "absolute";
      pnl.Style["bottom"] = bottom.ToString() + "px";
      pnl.Style["left"] = left.ToString() + "px";
      pnl.ID = "pnltype" + j.ToString();
    
    }
    

    【讨论】:

      【解决方案4】:

      也许您可以按如下方式更改 CreateTextBox 过程:

      private void CreateTextbox(int Number)
      {
        pnl.Controls.Clear();
      

      【讨论】:

        【解决方案5】:

        您收到此错误的具体原因是您在SelectedIndexChanged 上调用CreateTextbox(),而文本框已经在Page_Load 上创建。

        @Pankaj 的回答效果很好,但考虑到错误的原因,我想我会添加另一个解决方案。

        我知道您需要在 Page_Load 上调用 CreateTextBox() 以获得初始视图,所以...

        解决方案

        如果您只是在您的CreateTextBox() 方法中添加pnl.Controls.Clear(),然后再次创建文本框,那将解决您的问题。所以它看起来像这样:

        private void CreateTextbox(int Number)
        {
          try
          {
            TextBox txtTextbox;
            Label lbltxtTextbox;
            for (int i = 0; i < Number; i++)
            {
              txtTextbox = new TextBox();
              txtTextbox.ID = "txtbox" + i;
              lbltxtTextbox = new Label();
              lbltxtTextbox.ID = "lbltxtbox" + i;
              //Clear the controls before adding them again.
              pnl.Controls.Clear();
              pnl.Controls.Add(txtTextbox);
              pnl.Controls.Add(lbltxtTextbox);
            }
          }
          catch (Exception ex)
          {
          }
        }
        

        考虑这种方法而不是创建随机唯一 ID 的一个原因是:有时您需要能够从后面的代码中预测控件的名称,以便能够检索一个值,就像我遇到过的情况一样。

        无论如何,如果有人需要不同的方法,我想我会做出贡献。 =)

        【讨论】:

        • @Downvoter 我看不出我的回答如何符合糟糕或不适用帖子的标准。您对否决票的原因有任何反馈吗?我在这个解决方案中的方法有什么问题吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 2010-10-07
        相关资源
        最近更新 更多