我有一个包含27个DropDownLists的表供用户输入。我的表有27次出现这个HTML:
<span id="s1" runat="server"><asp:PlaceHolder ID="p1" runat="server"></asp:PlaceHolder></span>
其中跨度被索引为s1,s2,...,s27,PlaceHolders被索引为p1,p2,...,p27。跨度被索引的原因是我可以用任何选择替换DropDownList - 即,DropDownList将消失。
以下是我如何生成DropDownLists:
protected void Page_Load(object sender, EventArgs e)
{
var data = CreateDataSource();
int x;
for (x = 1; x <= 27; x++)
{
DropDownList dl = new DropDownList();
string index = x.ToString();
dl.ID = "TrendList" + index;
dl.AutoPostBack = true;
dl.SelectedIndexChanged += new EventHandler(this.Selection_Change);
dl.DataSource = data;
dl.DataTextField = "TrendTextField";
dl.DataValueField = "TrendValueField";
dl.DataBind();
if (!IsPostBack)
{
dl.SelectedIndex = 0;
}
PlaceHolder ph = (PlaceHolder)form1.FindControl("p" + index);
ph.Controls.Add(dl);
}
}
最后一行发生运行时错误。我可以选择我想要的任何DropDownList并进行选择,但是当我选择第二个DropDownList并进行选择时,我得到了这个错误:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Line 46: }
Line 47: PlaceHolder ph = (PlaceHolder)form1.FindControl("p" + index);
Line 48: ph.Controls.Add(dl);
Line 49: }
当我通过蛮力这样做时,这似乎有效:
p1.Controls.Add(DropList1);
p2.Controls.Add(DropList2);
etc....
但现在我收到了一个错误。我在调试器中运行了这个,但我找不到空引用。
感谢任何建议。
问候。
答案 0 :(得分:0)
您是否尝试过使用一个占位符?错误消息似乎是关于如何没有占位符的ID为“p”+ index.ToString()
答案 1 :(得分:0)
占位符在技术上不是form1,它们处于form1的跨度中(或者跨度在其他控件中等)。
这适用于跨度嵌套在form1中的情况:
var s = form1.FindControl("s" + index);
var ph = s.FindControl("p" + index);
ph.Controls.Add(dl);
答案 2 :(得分:0)
FindControl
方法不是递归的,因此您必须使用迭代嵌套对象的方法。以下是SO上的一个很好的示例:C#, FindControl
答案 3 :(得分:0)
问题是每个新页面都调用了这个函数。这意味着在第一次运行后,第一个占位符不再存在并抛出空引用错误。这个代码解决了这个问题:
if (placeHolder != null)
{
placeHolder.Controls.Add(ddl);
}