【问题标题】:SelectedValue property and dynamically created DropDownLists. ASP.NETSelectedValue 属性和动态创建的 DropDownLists。 ASP.NET
【发布时间】:2012-11-24 20:54:47
【问题描述】:

.aspx 文件中包含常用的 html 代码和“Panel1”控件。 首先,我正在创建一个名为“ddl”的下拉列表,并向其中添加一些 ListItem,所有这些都来自后面的代码。接下来我想创建一定数量的其他 DropDownLists 并将我添加到“ddl”的所有 ListItems 复制到它们,之后我需要在页面运行时将它们添加到“Panel1”控件中。最重要的部分是我希望所有动态创建的下拉列表在运行页面时都有一个选定的值。可以看下面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    DropDownList ddl = new DropDownList();
    ddl.Items.Add(new ListItem("One", "1"));
    ddl.Items.Add(new ListItem("Two", "2"));
    ddl.Items.Add(new ListItem("Three", "3"));
    ddl.Items.Add(new ListItem("Four", "4"));
    ddl.Items.Add(new ListItem("Five", "5"));
    ddl.Items.Add(new ListItem("Six", "6"));
    ddl.Items.Add(new ListItem("Seven", "7"));

    int j = 2;
    for (int h = 0; h < 3; h++)
    {
        DropDownList ddlDynamic = new DropDownList();

        //Add the items from ddl to the new dropdownlsit
        for (int i = 0; i < ddl.Items.Count; i++)
        {
            ddlDynamic.Items.Add(ddl.Items[i]);
        }
        //the selected item in the first dropdownlist 
        //must be "Two" but it will be "Four". WHY???
        ddlDynamic.SelectedValue = j.ToString();
        ddlDynamic.ID = h.ToString();
        Panel1.Controls.Add(ddlDynamic);
        Panel1.Controls.Add(new LiteralControl("<br />"));
        j++;
    }
}

这里的问题是所有三个下拉列表的选定值都是相同的,它将是“四”,而逻辑上第一个必须是“二”,第二个是“三”,第三个必须是“四”选定的值。第一个问题是:我做错了什么?

第二个问题。 当使用 ddlDynamic.Items.FindByValue(j.ToString()).Selected = true; 而不是 ddlDynamic.SelectedValue = j.ToString(); 时,我收到“不能在 DropDownList 中选择多个项目”。这是为什么呢?

谢谢。

【问题讨论】:

    标签: asp.net drop-down-menu


    【解决方案1】:

    我找到了答案。这里重要的是要记住 ddlDynamic.Items.Add(ddl.Items[i]); 行,通过引用从“ddl”下拉列表中添加项目,并且不会将 ListItems 复制到使用“for”循环动态创建的每个 DropDownLists 中。所有动态创建的下拉列表都使用之前初始化并添加到“ddl”的相同列表项。重要的是要知道:

    ddlDynamic.DataSource = ddl.Items;
            ddlDynamic.DataBind();
    

    将做同样的事情:将通过引用“ddl”来使用 ListItems。所以我找到的解决方案是为每个动态创建的 DropDownList 创建 ListItems,并从源填充它们,在这种情况下它将是一个 DataTable:

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("text", typeof(string));
        table.Columns.Add("value", typeof(string));
    
        table.Rows.Add("One", "1");
        table.Rows.Add("Two", "2");
        table.Rows.Add("Three", "3");
        table.Rows.Add("Four", "4");
        table.Rows.Add("Five", "5");
        table.Rows.Add("Six", "6");
        table.Rows.Add("Seven", "7");
    
        int j = 1;
        for (int h = 0; h < 3; h++)
        {
            DropDownList ddlDynamic = new DropDownList();
            foreach (DataRow rw in table.Rows)
            {
                ddlDynamic.Items.Add(new ListItem((string)rw["text"], (string)rw["value"]));
            }
    
            ddlDynamic.SelectedValue = j.ToString();
            ddlDynamic.ID = h.ToString();
            Panel1.Controls.Add(ddlDynamic);
            Panel1.Controls.Add(new LiteralControl("<br />"));
            j++;
        }
    }
    

    如果有人有更好的想法,请告诉我。

    【讨论】:

      【解决方案2】:

      你答对了。我正在玩代码,并认为我会继续发布我所拥有的。

      protected void Page_Load(object sender, EventArgs e)
      {
          var numListControls = 3;
          for (int i = 0; i < numListControls; i++)
          {
              var newList = new DropDownList() { ID = i.ToString() };
              newList.Items.AddRange(GetListItems(i + 1));
              Panel1.Controls.Add(newList);
              Panel1.Controls.Add(new LiteralControl("<br />"));
          }        
      }
      
      string[] values = new[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven" };
      public ListItem[] GetListItems(int selectedValue)
      {           
          return values.Select((val, pos) => new ListItem() {
              Text=val, 
              Value=(pos + 1).ToString(), 
              Selected = selectedValue == pos
          }).ToArray();
      }
      

      【讨论】:

      • 是的,你也有一个正确的答案。但是,这段代码用于我在树视图中有很多类别和子类别的页面中,当我想编辑它们时,我将它们加载到页面中,靠近每个类别名称,成为具有选定 ParentID 的下拉列表那个特定的类别。因此,由于 ParentID 取决于另一个类别的 ID,因此将这个 ParentId 添加到列表的“Value”中对我来说很重要,而列表的“Text”属性显示的是 ParentId 的名称。然而,使用二维数组来解决这个问题也是合乎逻辑的。谢谢你的回答。
      【解决方案3】:

      我建议你阅读this article。它有一点:“很容易假设添加到占位符的所有控件也会自动添加到 ViewState。但事实并非如此”

      【讨论】:

      • 感谢您的回答。你指的那篇文章真的很好。但是答案有点不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2016-08-05
      • 2019-05-02
      • 2011-09-10
      • 2020-01-08
      • 1970-01-01
      相关资源
      最近更新 更多