我想在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。
[编辑]
基本方案:
Resize
事件。 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的确切作用是:)