2013-10-18 33 views
-2

我有一個ListView其中Checked = true和兩個組(Selected和Not Selected)。在選中我希望將項目移動到合適的組,但似乎移動組會導致再次觸發ItemChecked事件。c#WinForms ListView按選擇分組

private void Form1_Load(object sender, EventArgs e) 
{ 
    listView1.ItemChecked += listView1_ItemChecked; 
} 

private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) 
{ 
    foreach (ListViewItem item in listView1.Items) 
    { 
     if (item.Checked && item.Group != listView1.Groups["grpSelected"]) 
     { 
      Console.WriteLine("Checked = true [1] : " + item.Text); 
      item.Group = listView1.Groups["grpSelected"]; 
      Console.WriteLine("Checked = true [2] : " + item.Text); 
      break; 
     } 
     if (!item.Checked && item.Group != listView1.Groups["grpNotSelected"]) 
     { 
      Console.WriteLine("Checked = false [1] : " + item.Text); 
      item.Group = listView1.Groups["grpNotSelected"]; 
      Console.WriteLine("Checked = false [2] : " + item.Text); 
      break; 
     } 
    } 
} 

結果在輸出從經過去! - >經過

Checked = false [1] : test0 
Checked = true [1] : test0 
Checked = true [2] : test0 
Checked = false [2] : test0 

有沒有更好的辦法讓這個功能嗎?或者解決問題的方法?目前我需要雙擊來獲得所需的效果,但它非常難看!

編輯

這個工作,而且似乎是錯誤的...

private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) 
{ 
    listView1.ItemChecked -= listView1_ItemChecked; 
    foreach (ListViewItem item in listView1.Items) 
    { 
     if (item.Checked && item.Group != listView1.Groups["grpSelected"]) 
     { 
      item.Group = listView1.Groups["grpSelected"]; 
      item.Checked = true; 
      break; 
     } 
     if (!item.Checked && item.Group != listView1.Groups["grpNotSelected"]) 
     { 
      item.Group = listView1.Groups["grpNotSelected"]; 
      item.Checked = false; 
      break; 
     } 
    } 
    listView1.ItemChecked += listView1_ItemChecked; 
} 

回答

0

試試這個:

//Suppose the first Group is Checked, the second Group is Unchecked  
//ItemCheck event handler for your listView1 
private void listView1_ItemCheck(object sender, ItemCheckEventArgs e){ 
    listView1.Items[e.Index].Group = listView1.Groups[e.NewValue == CheckState.Checked ? 0 : 1]; 
} 
//you need to do this initially to group your items correctly 
foreach (ListViewItem item in listView1.Items) 
    item.Group = listView1.Groups[item.Checked ? 0 : 1]; 
+0

試過'listView1.Items [e.Item.Index]。集團= ListView1的.Groups [e.Item.Checked? 0:1];'但仍然是相同的問題 – rjinski

+0

@rjinski你有**註冊**'ItemCheck'你的'listbox'事件處理程序?順便說一句,**我測試了這個**,我不是這樣寫的。 –

+0

@rjinski你必須刪除你的代碼,不要使用你的代碼與我的代碼同時使用。 –