FindControl和Get下拉列表的选定值

本文关键字:下拉列表 Get FindControl | 更新日期: 2023-09-27 18:12:17

当使用c#代码查找从SQL数据结果动态添加的HTML控件时,会发生这种情况。

使用下面的迭代通过表行和行每个表行,我们写控件的值,在这种情况下是一个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);

我得到了想要的结果,从单元格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);

FindControl和Get下拉列表的选定值

当您试图"破解"ASP时,通常会发生这种情况。净内部。我的意思是"破解",因为使用魔法字符串来解析分配给子控件的自动生成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);
}

选项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控件后,请确保检查控件是否成功检索。

希望有意义

尝试更改循环,以便在行上调用findcontrol:

for (int i = 1; i <= Table1.Rows.Count - 1; i++)
{
     HtmlSelect select = Table1.Rows[i].FindControl("MainContent_selectBoxstatus" + i) as HtmlSelect;  
}