找到了具有相同ID的多个控件

时间:2012-04-02 07:35:04

标签: asp.net

我有以下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.

5 个答案:

答案 0 :(得分:7)

GUID

更改以下行

txtTextbox.ID = "txtbox" + sequentialId;

到下面的行

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

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

答案 1 :(得分:2)

我找到了以下针对您所遇到的错误的修复程序。

drp_SelectedIndexChanged上触发SelectedIndexChanged并且not zero index时,您会收到错误“找到具有相同ID的多个控件'txtbox0'。FindControl要求控件具有唯一ID。 “当索引1被选中超过一次时。

更改

if (drp.SelectedIndex != 0) statement 

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

答案 2 :(得分:1)

当缺少任何控件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();

}

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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

@ Pankaj的答案很有效,但我想我会考虑到错误的原因而添加另一种解决方案。

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

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

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的一个原因是:有时你需要能够从后面的代码中预测控件的名称,这样你才能检索到一个值,就像我曾经有过的那样。

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