【发布时间】:2011-01-02 07:06:15
【问题描述】:
我正在使用启用了多行和全行选择的 ListView 控件。当我一次选择多行时,我的一些行神奇地被选中。将鼠标拖动到上方以及选择一个鼠标并单击另一个鼠标时会发生这种情况。
在此处查看描述问题的图片:
柚子里到底是怎么回事?有人吗?
【问题讨论】:
-
好问题!非常清楚地描述了问题。
标签: c# winforms listview checkbox multi-select
我正在使用启用了多行和全行选择的 ListView 控件。当我一次选择多行时,我的一些行神奇地被选中。将鼠标拖动到上方以及选择一个鼠标并单击另一个鼠标时会发生这种情况。
在此处查看描述问题的图片:
柚子里到底是怎么回事?有人吗?
【问题讨论】:
标签: c# winforms listview checkbox multi-select
我在另一个论坛上回答了这个问题:
http://www.codeproject.com/Messages/3417741/Re-how-to-disable-multi-select-of-checkbox-in-list.aspx
HTH - 地面
【讨论】:
不幸的是,ListView 类中存在错误,这是其中之一。以下代码是对我有用的修复程序。
编辑:抱歉,这并不完全正确,尽管它确实可以防止您在问题中显示的错误。这可以防止选择多个项目,然后通过单击复选框来检查它们。
void SetupListView()
{
listView.ItemCheck += new ItemCheckEventHandler(listView_ItemCheck);
listView.MouseDown += new MouseEventHandler(listView_MouseDown);
listView.MouseUp += new MouseEventHandler(listView_MouseUp);
listView.MouseLeave += new EventHandler(listView_MouseLeave);
}
bool mouseDown = false;
void listView_MouseLeave(object sender, EventArgs e)
{
mouseDown = false;
}
void listView_MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
}
void listView_MouseDown(object sender, MouseEventArgs e)
{
mouseDown = true;
}
void listView_ItemCheck(object sender, ItemCheckEventArgs e)
{
if(mouseDown)
{
e.NewValue = e.CurrentValue;
}
}
【讨论】:
mouseDown = true; 更改为mouseDown = e.X > 20;。这对我有用,因为复选框位于 ListView 窗口的左侧。
这是一个简单的问题 试试这个
private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (ModifierKeys == Keys.Control || ModifierKeys == Keys.Shift)
{
e.NewValue = e.CurrentValue;
}
}
【讨论】:
|| (ModifierKeys == (Keys.Control | Keys.Shift)),以防用户出于某种原因同时按下shift+ctl。