首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

很急的有关问题,解答,(WinForm)

2012-03-29 
很急的问题,在线等解答,高手进!(WinForm)最近遇到了一个问题: 点击数据使listview中对应的那个单元格选中

很急的问题,在线等解答,高手进!(WinForm)
最近遇到了一个问题: 点击数据使listview中对应的那个单元格选中并且使滚动条自动滚动到对应的位置。
我使用了EnsureVisible()方法,但是有个缺陷,它只支持垂直滚动条。
但是因为可能会有很多列,所以同样也需要水平滚动条能够自动滚动到对应的列

网上也看了很多,但是还是不是太清晰。所以请高手帮忙!!!

[解决办法]
listview本身只支持选中某一行的第一个列,既然你无法选中后面的列,你怎么让它焦点移动到那个位置呢?建议你更换控件,用DataGridView来实现,界面处理下,看上去和listview差不多的。
[解决办法]
需要这样做,windows也没有那样做
[解决办法]

C# code
            listView1.Select();            listView1.Items[2].EnsureVisible();            SendKeys.Send("{RIGHT}{RIGHT}{RIGHT}{RIGHT}");
[解决办法]
探讨

C# code

listView1.Select();
listView1.Items[2].EnsureVisible();
SendKeys.Send("{RIGHT}{RIGHT}{RIGHT}{RIGHT}");


这是一段参考代码,水平滚动条通过键盘向右键输入来移动,输入的次数通过实际测试来决定。

[解决办法]
比较好的方法是#2楼qldsrx朋友建议的用DataGridView来实现。如果一定要用ListView,可以自己发LVM_SCROLL消息(会比较难修改和维护):
C# code
void EnsureColumnVisible(ColumnHeader column){    if (column.ListView.Scrollable && column.ListView.IsHandleCreated)    {        const int SB_HORZ = 0, LVM_SCROLL = 0x1014;        int currentPos = GetScrollPos(column.ListView.Handle, SB_HORZ);        int columnLeft = column.ListView.Columns.OfType<ColumnHeader>().Where(c => c.Index < column.Index).Sum(c => c.Width);        int shift = 0;        if (columnLeft + column.Width - currentPos > column.ListView.ClientRectangle.Width )        {            shift = columnLeft + column.Width - column.ListView.ClientRectangle.Width - currentPos;        }        else if (columnLeft - currentPos < 0)        {            shift = columnLeft - currentPos;        }        SendMessage(column.ListView.Handle, LVM_SCROLL, (IntPtr)(shift), IntPtr.Zero);    }}[DllImport("user32.dll", SetLastError=true)]static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll", SetLastError = true)]static extern int GetScrollPos(IntPtr hWnd, int nBar);
[解决办法]
探讨
这个是什么意思啊,没怎么看这个表达式……

[解决办法]
通过设置选中实现不了吗?
[解决办法]
用datagridview方便些,,建议楼主用datagridview,效果跟listview一样,,
[解决办法]
listView1.View = View.Details 

另外: 
listView1.Left = 0 ; 
listView1.Top = 0 ; 
listView1.Dock = = System.Windows.Forms.DockStyle.Fill; 
 
 

[解决办法]
探讨
汗,试过很多次,总是定位不准。

[解决办法]
这种不太好再已有控件上实现的功能,最好是重新写一个控件
[解决办法]
希望楼主能把你上下定位的程序也发出来,我最近也在找这方面的东西呢,让我也学习一下,谢谢了
[解决办法]
探讨
这个if条件我也没加,可是当listview列很多的时候,就会有问题的,你可以试试。

[解决办法]


探讨
...
他的代码大体上可以了,定位不准是那个if判断的问题,不清楚为啥要加,去掉后就对了。
...

[解决办法]
探讨
引用:
引用:
汗,试过很多次,总是定位不准。

他的代码大体上可以了,定位不准是那个if判断的问题,不清楚为啥要加,去掉后就对了。
修正后的代码,你试试,反正我试了没问题:

C# code

void EnsureColumnVisible(ColumnHeader column)
{
if (……

这……

热点排行