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

时间:2013-02-04 14:58:43

标签: c# winforms

我试图使用以下代码查找列表框中最长项目的宽度,然后更改列表框的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.我搜索了可能发生的原因,但没有找到任何原因。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

很难确切地知道,遗憾的是,当我写这篇文章时,我没有要求澄清作为评论所需的声誉,但是...

我已经尝试过你的代码,它对我来说很好。我能想到的是,如果您使用不同的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()

希望这会有所帮助。