具有自动调整大小、水平滚动条的列表框

本文关键字:滚动条 水平 列表 调整 | 更新日期: 2023-09-27 17:57:24

我正在尝试使用以下代码查找列表框中最长项的宽度,然后更改列表框的HorizontalExtent属性以使该项适合水平滚动条的边界:

Graphics widthFinder = listBox_Transactions.CreateGraphics();
int needScrollWidth = 0; int checkVal = 0;
for (int i = 0; i < listBox_Transactions.Items.Count; i++)
{
    checkVal = (int)widthFinder.MeasureString(listBox_Transactions.Items[i].ToString(), listBox_Transactions.Font).Width + 1;
    if (needScrollWidth < checkVal)
    { needScrollWidth = checkVal; }
}
listBox_Transactions.HorizontalScrollbar = true;
listBox_Transactions.HorizontalExtent = needScrollWidth;
listBox_Transactions.Invalidate();

代码似乎按预期工作,除了 widthFinder.MeasureString(listBox_Transactions.Items[i].ToString(), listBox_Transactions.Font).Width 始终返回 164。我已经搜索了可能发生的原因,但没有找到任何原因。有什么想法吗?

具有自动调整大小、水平滚动条的列表框

很难确定,可悲的是,当我写这篇文章时,我没有要求澄清作为评论所需的声誉,但是......

我已经尝试过您的代码,它对我来说效果很好。我能想到的是,如果您使用的是不同的 DisplayMember 和 ValueMember,那么我假设您正在将对象添加到 Items 属性而不是简单类型。在这种情况下,您的

listBox_Transactions.Items[i].ToString()

最终会为您提供对象的名称,而不是您希望的值。

假设我有一个类 Foo 列表并将其添加到您的列表框中

List<Foo> fooList = new List<Foo>();
fooList.Add(new Foo() { Bar = 1 });
fooList.Add(new Foo() { Bar = 2 });
fooList.Add(new Foo() { Bar = 3 });
fooList.Add(new Foo() { Bar = 45 });
listBox_Transactions.Items.AddRange(fooList.ToArray());
listBox_Transactions.DisplayMember = "Bar";
listBox_Transactions.ValueMember = "Bar";

然后在你的代码中,当我到达

listBox_Transactions.Items[i].ToString()

我会得到价值

"Namespace.Foo"

而不是我想要获得的价值。因此,这最终总是会给出相同的字符串长度。

要解决此问题,请在上面的代码中转换回您的对象类型,如下所示:

((Foo)listBox_Transactions.Items[i]).Bar.ToString()

希望这会有所帮助。