2017-06-15 63 views
1

我有一个CheckBoxList的和我想要得到的列表项时,我选择和取消选择item.I已经tryed这种解决方案如何从CheckBoxList中获取它的Selected属性已更改的ListItem?

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

当我选择一个项目,它会返回item.but当我取消一个项目将返回空值(当没有选择任何项目时)或其他项目(当有另一个选定项目时)。

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

回答

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; 
} 
+0

我用你的解决方案,但我创造了'UserControl',但Session'的'inestad我使用和静态property.tankyou – mohsen

+0

而当我使用数据绑定时,你的答案还有另一个问题。 – mohsen

0

我创建CustomControl像这一点,并使用“克日什托夫的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; 
    } 
相关问题