我有以下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.
答案 0 :(得分:7)
更改以下行
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的一个原因是:有时你需要能够从后面的代码中预测控件的名称,这样你才能检索到一个值,就像我曾经有过的那样。
无论如何,如果有人需要采用不同的方法,我认为我会做出贡献。 =)