日期:2014-05-18  浏览次数:21100 次

很急的问题,在线等解答,高手进!(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列很多的时候,就会有问题的,你可以试试。

------解决方案--------------------