获取ListBox显示的高度

时间:2009-05-08 18:01:31

标签: .net winforms listbox

有没有办法确定Windows窗体列表框的显示高度?在我正在开发的应用程序中,我有一个表格,其中有一个ListBox停靠在其中。我需要自动调整窗体大小以删除ListBox不使用的底部任何额外空间,因为ListBox.IntegralHeight设置为true。目前我使用Form.Height除以ListBox.ItemHeight然后将该值乘以ListBox.ItemHeight以使额外不必要的高度四舍五入来调整Form的大小。


this.Height = (this.Height / this.listBox.ItemHeight) * this.listBox.ItemHeight; 

这在Vista中运行良好,但是当我将我的应用程序带到XP时,出现问题并且表单底部仍有额外的空间。

我无法使用ListBox.PreferredHeight,因为只有在显示所有项目时,ListBox才会占用空间量。

3 个答案:

答案 0 :(得分:2)

我的问题已经解决了。

我发现ListBox.Height返回ListBox的显示高度,如果停靠,则返回甚至。这回答了我的问题,但不是我的问题的解决方案。

进一步的调试揭示了为什么表单在Vista上看起来正确并且在XP上不正确。我自己绘制的ListBox的ItemHeight是16px(因为我为每个项目绘制了16x16个图像),而ListBox是一个没有标题栏的单边框形式。事实上,Vista边框的高度加起来为16px(项目的高度),而XP边框的高度加起来为8px。我的高度计算 是正确的,但问题是我设置了Form.Height(表单的整个高度,包括边框)而不是Form.ClientSize(只是没有边框的内部区域)。因此,在Vista上,我丢失了一个项目,在XP上,列表框下方的额外空间是边框没有占用的8个剩余像素。我最初用问题发布的代码现在变成了:


this.ClientSize = new Size(
    this.ClientSize.Width, 
    (this.ClientSize.Height / this.listBox.ItemHeight) * this.listBox.ItemHeight);

这会将客户区高度舍入到最近的项目,并且有利于约束表单的大小调整。

如果我只想缩小表单以适合ListBox,则代码可以简化为:


this.ClientSize = new Size(this.ClientSize.Width, this.listBox.Height);

答案 1 :(得分:1)

我认为

System.Windows.Forms.SystemInformation.Border3DSize.Height

在这种情况下真的可以帮到你,因为它告诉你边界高度

答案 2 :(得分:0)

根据您的应用程序,将列表框放在适当的容器中以进行布局可能会很不错。只是一个建议,而不是你Q的答案。

当然,您可以考虑通过上面提到的容器代码来反映它们如何达到所包含控件的大小。