FindControl并获取下拉列表的选定值

时间:2014-07-09 05:53:35

标签: c# html findcontrol

当使用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);

2 个答案:

答案 0 :(得分:2)

当你试图“破解”ASP.NET内部时,通常会发生这种情况。我的意思是“黑客”,因为使用魔术字符串来解析分配给子控件的自动生成的ID非常不安全。有更好,更安全的方法来做到这一点。

1-如果您想渲染表格布局,我强烈建议您使用数据绑定控件,例如GridViewListView等,以便与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);
}

选项2代码分析

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;  
}