c# WinForms ListView 按选择分组
本文关键字:选择 WinForms ListView | 更新日期: 2023-09-27 18:35:56
>我有一个列表视图,它有 已检查 = true 和两组(已选择和未选择)。在选中时,我希望将项目移动到相应的组,但似乎移动组会导致再次触发项目检查事件。
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];