【发布时间】:2021-11-19 18:54:47
【问题描述】:
我想根据下拉项目中最长的字符串调整任何ComboBox 下拉菜单的宽度。我希望这适用于任何带有项目的ComboBox,这意味着项目是字符串的对象、带有DisplayMember 集合的对象或DataTable。我 found some code 适用于字符串,但不适用于设置 DisplayMember 时
static void resizeCombo(ComboBox cb)
{
cb.DropDownWidth = cb.Items.Cast<string>().Max(x => TextRenderer.MeasureText(x, cb.Font).Width);
}
在以下三个示例中,第一个只是字符串的示例将起作用,但以下两个不起作用(cb.Items.Cast<string>() 转换为字符串失败),并证明 DisplayMember 在绑定到不同类的源时会有所不同,所以我不能只使用“名称”,例如
var c = new string[] { "Name1", "Name2" };
comboBox.DataSource = c.ToList();
resizeCombo(comboBox);
var c1 = new Class1[] { new Class1() { ID = 1, Name1 = "Name1" }, new Class1() { ID = 2, Name1 = "Name2" } };
comboBox1.DisplayMember = "Name1";
comboBox1.ValueMember = "ID";
comboBox1.DataSource = c1.ToList();
resizeCombo(comboBox1);
var c2 = new Class2[] { new Class2() { ID = 2, Name2 = "Name1" }, new Class2() { ID = 2, Name2 = "Name2" } };
comboBox2.DisplayMember = "Name2";
comboBox2.ValueMember = "ID";
comboBox2.DataSource = c2.ToList();
resizeCombo(comboBox2);
我可以反映DisplayMember,并按名称查找字符串,它可以解决List<class> 的情况,但不能解决DataTable。
我正在寻找一种方法来获取ComboBox 中的所有字符串,无论它们是如何添加的。有吗?
【问题讨论】:
标签: c# winforms user-interface