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