【问题标题】:C# ListView with CheckBoxes, automatic checkbox checked when multi select rowsC# ListView with CheckBoxes,多选行时自动检查复选框
【发布时间】:2011-01-02 07:06:15
【问题描述】:

我正在使用启用了多行和全行选择的 ListView 控件。当我一次选择多行时,我的一些行神奇地被选中。将鼠标拖动到上方以及选择一个鼠标并单击另一个鼠标时会发生这种情况。

在此处查看描述问题的图片:

柚子里到底是怎么回事?有人吗?

【问题讨论】:

  • 好问题!非常清楚地描述了问题。

标签: c# winforms listview checkbox multi-select


【解决方案1】:

【讨论】:

  • 嗨,欢迎来到 SO。如果您的答案只是其他地方的链接,请考虑仅使用该链接发表评论。对于答案,如果您至少简要了解链接的含义,这将有所帮助。不过,一个很好的答案!
  • 经过大量搜索,您在该链接中的代码解决了我的问题!谢谢
【解决方案2】:

不幸的是,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 窗口的左侧。
【解决方案3】:

这是一个简单的问题 试试这个

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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多