【问题标题】:c# WinForms ListView Grouping by Selectionc# WinForms ListView 按选择分组
【发布时间】:2013-10-27 19:38:42
【问题描述】:

我有一个 ListView,它具有 Checked = 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 输出的结果 --> !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;
}

【问题讨论】:

    标签: c# winforms listview user-interface


    【解决方案1】:

    试试这个:

    //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].Group = listView1.Groups[e.Item.Checked ? 0 : 1];但还是同样的问题
    • @rjinski 您为您的listbox 注册 ItemCheck 事件处理程序了吗?顺便说一句,我对此进行了测试,我现在还不是很专业。
    • @rjinski 你必须删除你的代码,不要同时使用你的代码和我的代码。
    • 我忽略了这是 ItemCheck 而不是 ItemChecked - 真是太好了!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多