.net - 为 Listview 列实现一个很好的自动调整大小机制?

标签 .net vb.net winforms listview resize

我想补充一个体面的AutoResize我的 Listview 的机制,但我不知道该怎么做。

当表单调整大小时,我将最后一列设置为 Autoresize 本身:

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

    ColumnDownload.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize)

End Sub

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

enter image description here

enter image description here

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

我想要的外观就像 JDownloader 和所有好的程序都有,一个自动调整大小,它在垂直滚动条的开始处完全停止,如果不需要,不显示丑陋的水平滚动条,例如像这样:

enter image description here

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

EDIT:



“神奇的解决方案”,例如:
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 ListView 上的事件。
  • 计算除最后一列之外的所有列的宽度
  • 将最后一列的大小调整为其他列与 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);
    }
    

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

    关于.net - 为 Listview 列实现一个很好的自动调整大小机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685887/

    相关文章:

    c# - 将 DataTable 转换为强类型对象列表

    c# - 如何将图像从资源复制到磁盘

    asp.net - 如果用户在线,如何检查ASP.NET?

    c# - 为什么我不能从 C# 中的 nslookup 打印出所有 IP 地址

    c# - 运行 CMD 和 ffmpeg Windows 窗体

    .net - 160 位 SHA1 散列的前 32 位是否可以替代 CRC32 散列?

    c# - 如何打开实际上已关闭的 Wifi 适配器的 radio ?

    c# - 当构建 ".Net Standard"项目时 - 这意味着什么?

    c# - 如何在 c#.net 中制作来电显示

    VB.NET 相当于 VBA 函数中的可选 Range 参数