【问题标题】:How get the ListItem from CheckBoxList that it's Selected property has changed?如何从 CheckBoxList 中获取 ListItem 的 Selected 属性已更改?
【发布时间】:2017-06-15 06:10:32
【问题描述】:

我有一个 CheckBoxList,我想在选择和取消选择该项目时获取 ListItem。我已经尝试过这个解决方案

protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)
{
    var selectedItem = CheckBoxList1.SelectedItem;
}

当我选择一个项目时,它将返回该项目。但是当我取消选择一个项目时,将返回 null(当没有选择任何项目时)或另一个项目(当有另一个选定项目时)。

我现在应该如何获得我已经取消选择的项目?

【问题讨论】:

    标签: c# asp.net webforms checkboxlist


    【解决方案1】:

    您可以创建一个会话变量来跟踪当前选定的项目:

    protected void Page_Load(object sender, EventArgs e)
    {
        CheckBoxList1.AutoPostBack = true;
    
        List<ListItem> selectedItems = Session["SelectedItems"] as List<ListItem>;
        if(selectedItems == null)
        {
            Session["SelectedItems"] = new List<ListItem>();
        }
    }
    

    然后每次选择的项目发生变化时,您都可以将以前选择的项目与新选择的项目进行比较,并找出选择或取消选择的项目:

    protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Gather currently selected items
        List<ListItem> newSelectedItems = new List<ListItem>();
        foreach (ListItem item in CheckBoxList1.Items)
        {
            if (item.Selected == true) 
            {
                newSelectedItems.Add(item);
            }
        }
    
        List<ListItem> oldSelectedItems = Session["SelectedItems"] as List<ListItem>;
    
        // Compare previous items count with current items count 
        // to find out whether item has been selected or deselected
        if (newSelectedItems.Count > oldSelectedItems.Count)
        {
            // Item has been selected
            ListItem selectedItem = newSelectedItems.Except(oldSelectedItems).First();
        }
        else
        {
            // Item has been deselected
            ListItem deselectedItem = oldSelectedItems.Except(newSelectedItems).First();
        }
    
        Session["SelectedItems"] = newSelectedItems;
    }
    

    【讨论】:

    • 我已经使用了你的解决方案,但是我创建了UserControl,但是我使用了Session 的 inestad 和 static property.tankyou
    • 当我使用数据绑定时,您的答案还有另一个问题。
    【解决方案2】:

    我已经像这样创建了 CustomControl 并使用了“Krzysztof Bracha”解决方案。这样使用起来更简单

    用户控制:

    public class JooyaCheckBoxList : CheckBoxList
    {
        public JooyaCheckBoxList()
        {
            base.SelectedIndexChanged += JooyaCheckBoxList_SelectedIndexChanged;
            base.PreRender += JooyaCheckBoxList_PreRender;
        }
    
        private void JooyaCheckBoxList_PreRender(object sender, EventArgs e)
        {
            SelectedItems = Items.Cast<ListItem>().Where(li => li.Selected).ToList();
        }
        private static List<ListItem> SelectedItems { get; set; }
        private void JooyaCheckBoxList_SelectedIndexChanged(object sender, EventArgs e)
        {
            List<ListItem> CurrentSelectedItems = Items.Cast<ListItem>().Where(li => li.Selected).ToList();
            if (CurrentSelectedItems.Count > SelectedItems.Count)
            {
                var li = CurrentSelectedItems.Except(SelectedItems).SingleOrDefault();
                OnSelectedPropertChaned(li);
            }
            else if (CurrentSelectedItems.Count < SelectedItems.Count)
            {
                var li = SelectedItems.Except(CurrentSelectedItems).SingleOrDefault();
                OnSelectedPropertChaned(li);
            }
            else
            {
                OnSelectedPropertChaned(null);
            }
        }
    
        public event EventHandler<ListItem> SelectedPropertyChaned;
        public void OnSelectedPropertChaned(ListItem changedItem)
        {
            SelectedPropertyChaned?.Invoke(this, changedItem);
        }
    }
    

    我是这样使用的:

        protected void cblKeywords_SelectedPropertyChaned(object sender, ListItem changedItem)
        {
                MessageDisplay= changedItem.Text + "  ||  " + changedItem.Value; 
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多