如何调整 ListView 的高度以适应内容

Posted

技术标签:

【中文标题】如何调整 ListView 的高度以适应内容【英文标题】:How to resize height of ListView to fit content 【发布时间】:2021-08-09 17:35:18 【问题描述】:

大家好,我一直在网上寻找一个解决方案,让我可以根据其中的最后一个条目调整列表视图的大小。

到目前为止,我只知道如何使用 Telerik 和 Syncfusion 等其他控件来执行此操作...除了这些公司之外,我只能根据里面的内容找到调整 row or column 的方法它 - 不是列表视图本身的整体高度。其他示例也接近我想要做的,但适用于WPF。

我的 winform 现在看起来像这样:

但我想要它做的是:

在此之前有没有人这样做可以显示他们使用的代码?或者是否有更好的控制可以满足我的需要,可以满足我的需要?谢谢!

【问题讨论】:

如果您不需要ScrollViewer,则只需来自ListView 控制模板的remove it。 如果列表视图长于 LCD 屏幕高度分辨率,我可能需要滚动条。 你可以把ListView放在ScrollViewer里面。 如果你想根据整体内容调整 ListView 控件本身的大小 - 如果你想要这样做 - 只需调用 SendMessage 将LVM_APPROXIMATEVIEWRECT 发送到控件。它将返回 HI-Word 中的近似高度。该值包括 Header 的高度。 @Jimi 介意举个例子吗?我找到的只是 C++ 代码。 【参考方案1】:

向 Control 发送 LVM_APPROXIMATEVIEWRECT 消息,您可以返回一个大致的测量值,包括 Header 的高度和所有 Item 的大小。 将 Control 的 ClientSize 设置为此度量,应该允许调整 ListView 的大小,以显示所有项目的完整范围。

您可以指定要包含的项目数量 (wParam) 和首选大小 (lParam),或者将 lParamwParam 都设置为 -1:在这种情况下,所有项目都包括在内并且会自动检测大小。

请注意,高度可能包括水平滚动条高度:在底部可能会看到一个边距。 如果不希望这样做,请从整体高度中删除 SystemInformation.HorizontalScrollBarHeight

或者,如果 ListView 中的项目数建议,则执行相同的操作以将 Control 的范围限制为特定度量。

► 如 cmets 中所述,如果 ListView 停靠在 Form 上,设置其 ClientSize 没有任何可见效果。 在这种情况下,您还需要调整表单的大小,添加 ListView 的旧大小与其新计算大小之间的差异。

假设 ListView 被命名为listView1:

Size oldSize = listView1.ClientSize;
int hScrollBarHeight = SystemInformation.HorizontalScrollBarHeight

// Both wParam and lParam set to -1: include all Items and full size
int approxSize = NativeMethods.SendMessage(
    listView1.Handle, NativeMethods.LVM_APPROXIMATEVIEWRECT, -1, (-1 << 16 | -1));
int approxHeight = approxSize >> 16;
int approxWidth = approxSize & 0xFFFF;

Size newSize = new Size(approxWidth, approxHeight - hScrollBarHeight);

// If needed, resize the Form (here, grow and shrink) to adapt to the new size
// Checking the Dock property state is a possible example, apply whatever logic fits
if (listView1.Dock != DockStyle.None) 
    this.Height += newSize.Height - oldSize.Height;
    this.Width += newSize.Width - oldSize.Width;


listView1.ClientSize = newSize;

internal class NativeMethods 

    internal const int LVM_FIRST = 0x1000;
    internal const int LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 0x40;

    [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    internal static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);

【讨论】:

@dr.null 是的,这是可能的。 OP没有说。正如您所指出的,当计算新的 ClientSize 时,可以将此度量应用于 ListView 本身,或者可以将先前和新 ClientSize 之间的差异添加到 Form 的大小中。我将添加一个编辑以包含此用例。

以上是关于如何调整 ListView 的高度以适应内容的主要内容,如果未能解决你的问题,请参考以下文章

如何让标题自动调整其高度以适应其内容?

如何控制Listview每列的宽度自适应这列最长的内容

div 高度不会调整以适应内容

iframe 自动调整其高度以适应内容高度

UIWebview 调整高度以适应内容

自动调整多个文本区域的高度以适应加载的内容