2017-06-15 23 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; 
    } 
相關問題