为Listview列实现一个漂亮的自动调整机制?

Ele*_*ios 5 .net vb.net listview resize winforms

我想在AutoResizeListview中添加一个不错的机制,但我不知道该怎么做.

当Form调整大小时,我将最后一列设置为Autoresize selfs:

Private Sub Form1_Resize(sender As Object, e As EventArgs) _
Handles MyBase.Resize

    ColumnDownload.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize)

End Sub
Run Code Online (Sandbox Code Playgroud)

但是这种本机自动调整方法是错误的,因为当我调整应用程序的大小时,会显示水平滚动条:

在此输入图像描述

在此输入图像描述

当然如果我自己用鼠标选择最后一列分隔符来增加列宽,那么我想看/使用水平滚动条,但框架自动调整只是自动增加显示水平滚动条的大小,是如此丑陋和不受欢迎有没有必要调整表单大小时自动显示滚动条!

看起来就像JDownloader和所有不错的程序一样,Autoresize在垂直滚动条的开始处完全停止而不显示丑陋的水平滚动条(如果不需要),例如:

在此输入图像描述

我希望你能理解我的问题.

编辑:

' 魔术解决方案 '如下:

MyColumnHeader.Width = -2
MyColumnHeader.Width = -1
Run Code Online (Sandbox Code Playgroud)

......也一样.在这里看到好文章:http://visualbasic.about.com/od/quicktips/qt/ListViewQT.htm

实际上所有关于在.NET中调整Listview大小的谷歌搜索结果都是使用它,任何比例调整大小或替代,任何体面的自动缩放器,令人难以置信.

Gra*_*ian 5

ObjectListView是一个围绕 .NET ListView 的开源包装器,它有一个FillsFreeSpace属性可以做到这一点。

当用户调整控件大小时,该列将变大或变小,从而永远不会显示水平滚动条。正确实施相对复杂:)

有关更多详细信息,请参阅此链接

[编辑]

基本方案:

  1. 侦听ResizeListView 上的事件。
  2. 计算除最后一列以外的所有列的宽度
  3. 将最后一列的大小调整为其他列的宽度ClientSize与 ListView的宽度之差。

这将起作用:

private void ResizeLastColumn(int listViewWidth)
{
    int totalColumnWidth = 0;
    for (int i =0 ; i < listView1.Columns.Count - 1; i++) {
        totalColumnWidth += listView1.Columns[i].Width;
    }

    colLast.Width = Math.Max(listViewWidth - totalColumnWidth, 10);
}

private void listView1_Resize(object sender, EventArgs e)
{
    ResizeLastColumn(this.listView1.ClientSize.Width);
}
Run Code Online (Sandbox Code Playgroud)

对此的限制是在缩小控件时水平滚动条会轻微闪烁。为了解决这个问题,您需要拦截WM_WINDOWPOSCHANGING消息,并将列的大小调整为控件要变为的大小。这有点复杂——这正是 ObjectListView 所做的:)