listview 获取鼠标当前位置是第几列第几行

橘子皮zzz 子皮公司 流浪者  2019-05-07 01:58:44
如果listview 有加载内容的话可以获取到,这个我知道
我的问题是如果listview 在没有加载内容时(网格模式有显示网格线),如何判断当前鼠标位置是几行几列呢??

...全文
121 点赞 收藏 14
写回复
14 条回复
OrdinaryCoder 2019年05月07日
引用 9 楼 橘子皮zzz 的回复:
[quote=引用 6 楼 水边2 的回复:]
没有内容你计算行列有什么用?
没内容就是要报错啊


鼠标在不同的列内右键导入不同的数据[/quote]
如果要导入数据 最起码每一个单元格得对应一个变量 不能是null 不行直接用字段补位吧
回复 点赞
橘子皮zzz 2019年05月07日
引用 6 楼 水边2 的回复:
没有内容你计算行列有什么用? 没内容就是要报错啊
鼠标在不同的列内右键导入不同的数据
回复 点赞
橘子皮zzz 2019年05月07日
引用 7 楼 OrdinaryCoder 的回复:
用的WPF winform 还是Web 程序种类不 一样 获取方式也有差别
就是net窗体程序,不是web
回复 点赞
OrdinaryCoder 2019年05月07日
用的WPF winform 还是Web 程序种类不 一样 获取方式也有差别
回复 点赞
水边2 2019年05月07日
没有内容你计算行列有什么用? 没内容就是要报错啊
回复 点赞
橘子皮zzz 2019年05月07日
引用 3 楼 水边2 的回复:
listview的Click事件可以获取吧? 实在不行,在窗体的Click事件里,获取鼠标的x,y坐标,然后根据坐标获取所在位置的控件
坐标可以获取到,可是我只知道在listview有内容的时候,点击的地方是内容行之内的情况下用ListView1.GetItemAt和LI.SubItems.IndexOf(LI.GetSubItemAt())可以获取到行列,但是问题是ListView还没有内容的情况下获取不到,返回错误,通过xy坐标不知道怎么算出准确的行列数
回复 点赞
橘子皮zzz 2019年05月07日
引用 2 楼 OrdinaryCoder 的回复:
[quote=引用 1 楼 OrdinaryCoder 的回复:] 加一个click事件看一下
listview应该有鼠标移入和鼠标移出事件把 加上 看看参数e里有没有[/quote] e里获取不到行和列啊
回复 点赞
desperaso 2019年05月07日
改了改,再看看


。。。。。。
Area.Clear();
int get_x = 0;
foreach (ColumnHeader col in listView1.Columns)
{
Area.Add(new Rectangle(get_x, 0, col.Width, listView1.Height));
get_x += col.Width;
}
。。。。。。

回复 点赞
水边2 2019年05月07日
listview的Click事件可以获取吧? 实在不行,在窗体的Click事件里,获取鼠标的x,y坐标,然后根据坐标获取所在位置的控件
回复 点赞
OrdinaryCoder 2019年05月07日
引用 1 楼 OrdinaryCoder 的回复:
加一个click事件看一下

listview应该有鼠标移入和鼠标移出事件把 加上 看看参数e里有没有
回复 点赞
OrdinaryCoder 2019年05月07日
加一个click事件看一下
回复 点赞
desperaso 2019年05月07日
引用 12 楼 橘子皮zzz 的回复:
你的代码没看懂,不过测试了下,结果不对,第012列对的,第3列就错了,箭头是我鼠标点的地方


就是取得全部ColumnHeader的宽度,换算位置,放进Rectangle数组里面,判断鼠标位置在哪个Rectangle里,
临时写的是不是位置换算不准。
如果每行高度为固定,判断鼠标位置,换算位置比较就可以取得行号。
回复 点赞
橘子皮zzz 2019年05月07日
引用 11 楼 desperaso 的回复:

List<Rectangle> Area = new List<Rectangle>();
        private void listView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button==MouseButtons.Right)
            {
                Area.Clear();
                int get_x = 0;
                foreach (ColumnHeader col in listView1.Columns)
                {
                    Area.Add(new Rectangle(get_x, 0, col.Width, listView1.Height));
                    get_x += get_x + col.Width;
                }

                var index = Area.FindIndex(a=>a.Contains(e.Location));
                if (index!=-1)
                {
                    MessageBox.Show(index + " 列.");
                }
            }
        }
同理,按高度位置取行
你的代码没看懂,不过测试了下,结果不对,第012列对的,第3列就错了,箭头是我鼠标点的地方
回复 点赞
desperaso 2019年05月07日

List<Rectangle> Area = new List<Rectangle>();
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button==MouseButtons.Right)
{
Area.Clear();
int get_x = 0;
foreach (ColumnHeader col in listView1.Columns)
{
Area.Add(new Rectangle(get_x, 0, col.Width, listView1.Height));
get_x += get_x + col.Width;
}

var index = Area.FindIndex(a=>a.Contains(e.Location));
if (index!=-1)
{
MessageBox.Show(index + " 列.");
}
}
}


同理,按高度位置取行
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告