1

我正在尝试使用以下代码来查找列表框中最长项目的宽度,然后更改列表框的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 的异常。我已经搜索了可能发生这种情况的原因,但没有找到任何原因。有任何想法吗?

4

1 回答 1

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()

希望这会有所帮助。

于 2013-02-04T15:52:20.170 回答