C# WinC窗体列表视图按选择分组

C# WinC窗体列表视图按选择分组,c#,winforms,listview,user-interface,C#,Winforms,Listview,User Interface,我有一个ListView,它已选中=true,并且有两个组已选中和未选中。在选中时,我希望将项目移动到适当的组,但移动组似乎会导致再次触发ItemChecked事件 private void Form1_Load(object sender, EventArgs e) { listView1.ItemChecked += listView1_ItemChecked; } private void listView1_ItemChecked(object sender, ItemChec

我有一个ListView,它已选中=true,并且有两个组已选中和未选中。在选中时,我希望将项目移动到适当的组,但移动组似乎会导致再次触发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 = 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;
}
试试这个:

//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];

已尝试listView1.Items[e.Item.Index]。组=listView1.Groups[e.Item.Checked?0:1];但还是一样issue@rjinski是否已为listbox注册ItemCheck事件处理程序?顺便说一句,我已经测试过了,我现在不是写这篇文章的专家。@rjinski你必须删除你的代码,不要在我的代码中同时使用你的代码。我忽略了这是ItemCheck,而不是ItemChecked-非常有效!非常感谢。