设置ASP.NET ListItem的“Selected”属性(HTML Generic Control)

时间:2011-03-08 20:15:10

标签: asp.net

由于我无法控制的原因,我有一个包含输入和选择字段的表,这些字段使用带有runat="server"属性的常规HTML构建(与标准ASP.NET控件相对)。我试图根据从Session传递的值(同样,我的控件之外的因素)设置在页面加载时选择的值。

设置列表项的Selected属性不执行任何操作,也不会选择有问题的项目。我如何实现这一目标?

代码基本上就是这个(名称泛化):

HtmlSelect dropdownList = ((HtmlSelect)myTable.Rows[0].Cells[5].FindControl("DropdownList");
DataSet allListItems = this.GetDefaultListItems();
foreach (DataRow row in allListItems.Tables[0].Rows)
{
    ListItem li = new ListItem(row["TextField"].ToString(), row["ValueField"].ToString());
    if (li.Text == selectedListItemText)
    {
        li.Selected = true;
    }
    dropdownList.Items.Add(li);
}

Select部分不起作用,尽管它在适当的项目上执行。是否应该在特定事件中调用此代码?我相信它是在Page_Load中调用的;应该在Pre_Render中调用吗?

编辑03/09/2011 :嗯,我不知道我是如何解决的,但它现在正在运作。所以...是的。

2 个答案:

答案 0 :(得分:2)

尝试:

foreach (DataRow row in allListItems.Tables[0].Rows)
{
    ListItem li = new ListItem(row["TextField"].ToString(), row["ValueField"].ToString());
    dropdownList.Items.Add(li);    
    if (li.Text == selectedListItemText)
    {
        dropdownList.SelectedIndex = dropdownList.Items.Count-1;
    }
}

修改

在HtmlSelect中获取SelectedIndex的来源:

get {
    for (int i = 0; i < this.Items.Count; i++)
    {
      if (this.Items[i].Selected)
      {
          return i;
      }
    }
 }
...

set {
...
   if (value >= 0)
  {
      this.Items[value].Selected = true;
   }
}

意义......它在功能上应该在任何时候为单个ListItem设置Selected属性,所以我的建议在功能上与原始相同。

所以,怀疑:数据问题,例如标记为已选择的多个项目?生命周期问题(在错误的时间创建控件?)

答案 1 :(得分:0)

这是我的工作测试代码,现在,与你的不同之处是什么?

ASPX:

<table id="myTable" runat="server">
  <tr>
     <td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>Dropdown:</td><td><select id="DropdownList" runat="server"></select></td>
  </tr>
</table>

代码隐藏:

private string selectedListItemText {
    get {
        if (Session("selectedListItemText") == null) {
            Session("selectedListItemText") = "7. row";
        }
        return Session("selectedListItemText").ToString;
    }
    set { Session("selectedListItemText") = value; }
}

protected void Page_Load(object sender, System.EventArgs e)
{
    if (!IsPostBack) {
        HtmlSelect dropdownList = (HtmlSelect)myTable.Rows(0).Cells(5).FindControl("DropdownList");
        DataSet allListItems = this.GetDefaultListItems();
        foreach (DataRow row in allListItems.Tables[0].Rows) {
            ListItem li = new ListItem(row["TextField"].ToString(), row["ValueField"].ToString());
            if (li.Text == selectedListItemText) {
                li.Selected = true;
            }
            dropdownList.Items.Add(li);
        }
    }
}

private DataSet GetDefaultListItems()
{
    DataSet ds = new DataSet();
    DataTable tbl = new DataTable();
    ds.Tables.Add(tbl);
    tbl.Columns.Add("ValueField");
    tbl.Columns.Add("TextField");

    for (Int32 i = 1; i <= 10; i++) {
        DataRow row = tbl.NewRow();
        row["ValueField"] = i;
        row["TextField"] = i + ". row";
        tbl.Rows.Add(row);
    }
    return ds;
}

[从VB.Net转换为C#]