关于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#