在代码后面找不到HTML控件

时间:2013-02-12 08:59:36

标签: c# asp.net xml

我有一个div(id = main),它里面包含15个html选择控件,它们的ID是ddl1,ddl2,ddl3,...等等。

现在我想从XML文件中动态选择或分配索引,所以我编写了这段代码。

private void readxml(string spath) {
  XmlDocument doc = new XmlDocument();
  doc.Load(spath);
  //doc.LoadXml(spath);
  XmlNodeList xmlnodes = doc.SelectNodes("/Hedge/*");
  for (int i=1; i <= 15; i++) {
    (main.FindControl("ddl" + i) as DropDownList).SelectedIndex = Int32.Parse(xmlnodes[i].InnerText);
  }
}

但是这里发生错误......

  

对象引用未设置为对象的实例。

这可能是因为它无法找到控件(HTML选择控件)...... 谁能告诉我原因或解决我的问题?

3 个答案:

答案 0 :(得分:2)

您是否已将runat="server"添加到控件和Id="ddl1"

答案 1 :(得分:2)

如果有这样的标记:

<div id="main" runat="server">
    <select id="ddl1" runat="server"></select>
</div>

ddl1的类型不是DropDownList,而是HtmlSelect,因此请将代码更改为:

(main.FindControl("ddl" + i) as HtmlSelect).SelectedIndex = Int32.Parse(xmlnodes[i].InnerText);

如果仍为null错误,则xmlnodes为空的概率很高,这意味着加载XML文档或选择节点时出错。

答案 2 :(得分:1)

有两件事可能出错了。 一个是显而易见的

  (main.FindControl("ddl" + i) as DropDownList).SelectedIndex = 
            Int32.Parse(xmlnodes[i].InnerText);

由于您没有使用asp.net下拉列表,因此您无法将其转换为此内容。 所以它应该是

     (main.FindControl("ddl" + i) as HtmlSelect).SelectedIndex = 
                                                    Int32.Parse(xmlnodes[i].InnerText);

另一个可能是属性runat="server",如果您起诉html controls并希望在C#页面上访问它,则需要存在该属性。

   <select id="Select1" runat="server">
     <option value="1" Selected="True"> Item 1 </option>
     .....
  </select>