动态添加数据后 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" });
}
我在 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 usePage_Load()
method to add items to yourComboBoxList
control, like below. Don't forget to put acomma
betweenText
andValue
property while creating a newListItem
.
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" });
}