-2

Checked = true と 2 つのグループ (Selected と Not Selected) を持つ ListView があります。On Checked アイテムを適切なグループに移動したいのですが、グループを移動すると ItemChecked イベントが再びトリガーされるようです。

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 --> !Checked からの出力の結果

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;
}
4

1 に答える 1

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];
于 2013-10-18T20:40:46.717 に答える