复选框列表列表动态添加数据后项计数始终为 0
本文关键字:列表 动态 添加 数据 复选框 | 更新日期: 2023-09-27 18:14:31
我在aspx
代码中有以下代码。我想添加ListItem
复选框到ColumnsList
并在单击按钮时查找所有选中的复选框。
但是当我尝试在按钮上获取所选项目时,单击列列表计数变为 0。
<asp:checkboxlist runat="server" EnableViewState="true" id="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 中。
我试图模拟您正在尝试的内容,这是逐步的解决方案。
步骤1
override OnLoad()
:您可以使用Page_Load()
将项添加到ComboBoxList
控件的方法,例如 下面。不要忘记在创建新ListItem
时Text
和Value
属性之间放置comma
。
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" });
}
}
第 2 步:在此之后,我创建了一个像您这样的按钮单击事件,但是 在那里只写了一行,以获得所选项目的计数 所 示。
protected void Button1_Click(object sender, EventArgs e)
{
var count = this.ColumnsList.Items.Cast<ListItem>().Count(li => li.Selected);
}
注意:检查按钮点击事件。 this.ColumnsList.Items.Count
将返回 ComboBoxList 中存在的项目计数,循环item.Selected
将告诉您是否选择了该项目。但是,var selected
将为您提供最后一项的状态,因为您正在覆盖每个项的值。
我最终将加载列表的代码从页面加载移动到 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" });
}
您的代码在我的解决方案中运行良好,但以下情况除外:
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
}
}
}
当您需要重新创建或重新创建动态控件时,您应该在 PreInit evet 上添加动态数据:
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" });
}
}
有关页面生命周期的详细信息。