动态添加数据后 CheckBoxList ListItem Count 始终为 0

CheckBoxList ListItem Count always 0 after adding data dynamically

我在 aspx 代码中有以下代码。我想将 ListItem 复选框添加到 ColumnsList 并在单击按钮时查找所有选中的复选框。

但是当我尝试在单击按钮时获取所选项目时,ColumnsList 计数变为 0。

<asp:checkboxlist runat="server" EnableViewState="true" id="ColumnsList"/>

在后面的代码中,我将数据添加到我的 ColumnsList 中,如下所示

public override void OnLoad()
{
    if(!this.IsPostBack)
    {
       this.ColumnsList.Items.Add(new ListItem { Text= "Text1",  Value = "value1"    });
       this.ColumnsList.Items.Add(new ListItem { Text= "Text2",  Value = "value2"  });
    }
}

// 这里是按钮点击监听器

private void Button_Click(object sender, EventArgs eventArgs)
{
    // Count is 0 instead of 2
    var count = this.ColumnsList.Items.Count;
    foreach(ListItem item in this.ColumnsList.Items)
    {
        var selected = item.Selected;
        // add selected to a list..etc

    }
}           

注意:应用程序部署在共享点 2010。

当您需要重新创建或重新创建动态控件时,您应该在 PreInit 事件上添加动态数据:

protected override void OnPreInit(EventArgs e)
{
    if(!this.IsPostBack)
    {
       this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" });
       this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2" });
    }
}

More information关于页面生命周期。

您的代码在我的解决方案中运行良好,但以下情况除外:

您的 OnLoad 实现没有覆盖参数 EventArgs。在我的解决方案中,需要在 OnLoad() 中声明 EventArgs 参数。

protected override void OnLoad(EventArgs e)
{
   //base.OnLoad(e);
   if(!this.IsPostBack)
   {
       this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1"    });
       this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2"  });
   }
}

最后,是Text='text' Value='value'Text='text', Value='value'中的逗号分隔符 其他任何东西都可以。

编辑:这是我的按钮实现。

protected void Button_Click(object sender, EventArgs e)
{
    foreach (ListItem itemList in ColumnsList.Items)
    {
       if (itemList.Selected)
       {
          // selected
       }
    }
}

我试着模拟你正在尝试的,这里是一步一步的解决方案。

Step 1: Instead of creating override OnLoad() method, you can use Page_Load() method to add items to your ComboBoxList control, like below. Don't forget to put a comma between Text and Value property while creating a new ListItem.

protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostBack)
    {
        this.ColumnsList.Items.Add(new ListItem { Text= "Text1",  Value = "value1" });
        this.ColumnsList.Items.Add(new ListItem { Text = "Text2", Value = "value2" }); 
        this.ColumnsList.Items.Add(new ListItem { Text = "Text3", Value = "value3" });
        this.ColumnsList.Items.Add(new ListItem { Text = "Text4", Value = "value4" });
    }
}

Step 2: After this, I created a button click event like yours, but wrote only single line there to get the count of selected items as shown below.

protected void Button1_Click(object sender, EventArgs e)
{
    var count = this.ColumnsList.Items.Cast<ListItem>().Count(li => li.Selected);
}

注意: 检查你的按钮点击事件。 this.ColumnsList.Items.Count 将 return 您计算 ComboBoxList 中的项目数,item.Selected 从循环中将告诉您该项目是否被选中。但是 var selected 会给你最后一个项目的状态,因为你正在覆盖每个项目的值。

我最终将加载列表的代码从 pageload 移动到 OnInit,如下所示并且它起作用了。

protected override void OnInit(EventArgs e)
{
  this.ColumnsList.Items.Add(new ListItem { Text= "Text1",  Value = "value1"    });
  this.ColumnsList.Items.Add(new ListItem { Text= "Text2",  Value = "value2"  });

}