我想在Listview中添加一个体面的AutoResize机制,但是我不知道该怎么做。

当表单调整大小时,我将最后一列设置为自动调整大小:

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

    ColumnDownload.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize)

End Sub

但是这种 native 的autoresize方法是如此错误,因为当我调整应用程序的大小时,显示了水平滚动条:



当然,如果我用鼠标自己选择最后一个列分隔符以增加列宽,那么我想查看/使用水平滚动条,但是框架自动调整大小只是自动增加了显示水平滚动条的大小,因此非常丑陋,没有必要在调整表单大小时自动显示该滚动条!

我的外观就像JDownloader以及所有不错的程序一样,它的Autoresize恰好在垂直滚动条的开始处停止,而不在不需要时显示丑陋的水平滚动条,例如:

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



诸如此类的“魔术解决方案”:
MyColumnHeader.Width = -2
MyColumnHeader.Width = -1

...是一样的。在这里查看好文章:http://visualbasic.about.com/od/quicktips/qt/ListViewQT.htm

实际上,有关在.NET中调整Listview大小的所有Google搜索结果都在使用该功能,无论是按比例缩放大小还是其他选择,任何体面的自动缩放器都令人难以置信。

最佳答案

ObjectListView是.NET ListView的开放源代码包装程序,它具有FillsFreeSpace属性,该属性可以完成此操作。

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

有关更多详细信息,请参见this link

[编辑]

基本方案:

  • 在ListView上监听Resize事件。
  • 计算除最后一个
  • 外的所有列的宽度
  • 将最后一列的大小调整为其他列的宽度与ListView的ClientSize的差。

  • 这将起作用:
    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);
    }
    

    这样做的限制是,在缩小控件时,水平滚动条将略微闪烁。为了解决这个问题,您需要截获WM_WINDOWPOSCHANGING消息,并将列的大小调整为控件将要变成的大小。这有点复杂-以及ObjectListView的确切作用是:)

    10-05 19:30