当使用C#代码来查找从SQL数据结果动态添加的HTML控件时,会发生这种情况。
使用下面有一个迭代虽然Table行和每行表行,我们编写Controls值,在本例中是一个HtmlSelect。 Html选择元素在单元格3中
for (int i = 1; i <= Table1.Rows.Count - 1; i++)
{
HtmlSelect select = Form.FindControl("MainContent_selectBoxstatus" + i) as HtmlSelect;
System.Diagnostics.Debug.Write(select.Value);
}
导致:
类型'System.NullReferenceException'的第一次机会异常 发生在project.dll
如果我使用以下内容:
for (int i = 1; i <= Table1.Rows.Count - 1; i++)
System.Diagnostics.Debug.Write(Table1.Rows[i].Cells[0].Text);
我得到了Cell 1中文本的预期结果。
如何创建选择下拉列表:
for (int i = 0; i < dr.FieldCount; i++)
HtmlSelect sStatus = new HtmlSelect();
sStatus.Items.Add(new ListItem("Working", "0"));
sStatus.Items.Add(new ListItem("Fault", "1"));
sStatus.SelectedIndex = 0;
sStatus.Attributes.Add("class", "dropdownlist");
sStatus.ID = "selectBoxstatus" + rowindex;
cell.Controls.Add(sStatus);
答案 0 :(得分:2)
当你试图“破解”ASP.NET内部时,通常会发生这种情况。我的意思是“黑客”,因为使用魔术字符串来解析分配给子控件的自动生成的ID非常不安全。有更好,更安全的方法来做到这一点。
1-如果您想渲染表格布局,我强烈建议您使用数据绑定控件,例如GridView
,ListView
等,以便与RowDatabound
事件相交并以安全的方式检索子控件
2-如果您无法承担重写费用,请按以下步骤更换您的代码......
for (int i = 0; i < Table1.Rows.Count; i++)
{
HtmlSelect select = Table1.Rows[i].Cells[0].FindControl(string.Format("selectBoxstatus{0}", i)) as HtmlSelect;
if(select != null)
System.Diagnostics.Debug.Write(select.Value);
}
for (int i = 0; i < Table1.Rows.Count; i++)
挑剔,但将i
初始化为0
,这样可以更轻松地阅读...相信它
HtmlSelect select = Table1.Rows[i].Cells[0].FindControl(string.Format("selectBoxstatus{0}", i)) as HtmlSelect;
我不太确定Form
在原帖中的含义,但使用object
迭代.... Table1
行集合更有意义。我也引用Cell[0]
这是迭代当前行中的第一个单元格(随意调整它)...这仍然不安全但是它是在当前场景中实现它的唯一方法,如果你需要的话更多的代码安全,然后诉诸选项一。另请注意FindControl
不会乱用自动生成的id,它只是使用为子控件指定的实际Id
if(select != null)
尝试检索select
控件后,请务必检查控件是否已成功检索。
希望它有意义
答案 1 :(得分:1)
尝试更改循环,以便在行上调用findcontrol:
for (int i = 1; i <= Table1.Rows.Count - 1; i++)
{
HtmlSelect select = Table1.Rows[i].FindControl("MainContent_selectBoxstatus" + i) as HtmlSelect;
}