当前位置:编程学习 > C#/ASP.NET >>

关于winform下listview的checkbox的问题

小弟新人,各位大大好~

新学c#,最近在做一个winform程序,里面要用到带checkbox的listview,第一列checkbox,第二列是string,问题来了

在多选的时候如果鼠标放开的位置在checkbox上,就会导致多个item的checkbox状态改变

请问有没有办法使得多选只改变selected状态,不改变checkbox状态

不知道有没有说清楚,恳请各位海涵并予以解答,谢谢~ --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 无奈再顶 --------------------编程问答--------------------

测试了一下 确实是存在这个问题 你自己写checkbox 的鼠标点击触发过程
让它up 和 down 都在那个小方框上才有效~· 这样子应该可以~·





--------------------编程问答-------------------- 谢谢回复,再请问

使用过程中发现如果能将checkbox和listviewitem的选中状态分开,用户体验会更好

可不可以listview中新加入一个item的时候,自动在窗体上生成一个单独的checkbox,然后将两者的选中状态绑定起来

现在的问题是我还不会这样的动态生成控件,烦请提供一个sample,再次感谢! --------------------编程问答-------------------- 顶一下 --------------------编程问答-------------------- 再顶一下 --------------------编程问答-------------------- 顶,分数少了可以再加 --------------------编程问答-------------------- 在csdn的下载里面找“c#实例精选!”这个下载
例子10不知道可以解决你的问题不?
顺便给你帮忙顶一下 --------------------编程问答-------------------- 你可以在selected事件里面设置checkbox的状态
其中checked设为false
试试
应该可以 --------------------编程问答-------------------- 这个的确是个问题,表现的现象为党单选的时候(鼠标单击)不存在你现在这个问题,只有当多选的时候就有你说的这个问题了。
这个问题是由于这个listview控件本身的缺陷造成的。我2个月前也遇到你目前的问题,不过我解决了。需要一些work around.

首先要你要想一下在listview上面多选,用户怎样操作,一般让用户实现多选,用户至少需要按下Shift 或者 Ctrl键。
因此我们就可以用这个事件入手,解决你的这个问题。解决步骤如下。
1.在你的这个form中加入一个全局变量:
private bool isMultipleSelecting = false; //初始设置为false


2.让你的listview 捕获如下2个键盘事件,用于标记开始多选和结束多选

private void lstvwImage_KeyDown(object sender, KeyEventArgs e)
{
  this.isMultipleSelecting = (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.ControlKey);
}

private void lstvwImage_KeyUp(object sender, KeyEventArgs e)
{
  this.isMultipleSelecting = !(e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.ControlKey);



3.让你的ListView捕获ItemCheck事件,这里我用了黑体表示,主要是不要把这个事件和另外一个事件ItemChecked搞错。ItemCheck是发生在Checkbox要改变状态但是还没真正改变的时候,而ItemChecked是改变了以后发生的事件。这点在于解决这个问题上非常重要。因为只有在ItemCheck这个事件的ItemCheckEventArgs的参数中,我们可以同时获得这个即将改变状态的checkbox当前的状态和即将要改变的状态。并且我们可以修改这个即将要改变的状态。代码如下:

private void lstvwImage_ItemCheck(object sender, ItemCheckEventArgs e)
{
   if (true == this.isMultipleSelecting)
   {
      e.NewValue = e.CurrentValue;
      return;
   }
}

从上面的代码很容易看出,当用户正在多选时候,e.NewValue 永远被付值成了e.CurrentValue,从而达到了你的目的。


如果,你的listview 支持双击的话,那么你会遇到类似的问题,解决方法和我上面的大同小异,无非是多捕获一个ListView的Click事件,并且在该事件中判断是不是鼠标双击。判断鼠标双击的代码如下:

private void lstvwImage_MouseDown(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Left)
  {
    this.isDoubleClickingOnTheItem = (e.Clicks >= 2);
  }
}


补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,