无论数据源类型如何,ComboBox 自动 DropDownWidth
ComboBox auto DropDownWidth regardless of DataSource type
我想根据下拉项目中最长的字符串调整任何 ComboBox
下拉菜单的宽度。我希望它适用于任何 ComboBox
的项目,这意味着项目是字符串的项目、某些设置了 DisplayMember
的对象或 DataTable
。 I 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
中的所有字符串,而不管它们是如何添加的。有吗?
组合框有 GetItemText
方法,returns 项目的字符串表示。
这应该有效:
static void resizeCombo(ComboBox cb)
{
if (cb.Items.Count == 0) cb.DropDownWidth = cb.Width;
else
{
int maxWidth = int.MinValue;
for (int i = 0; i < cb.Items.Count; i++)
{
maxWidth = Math.Max(maxWidth, TextRenderer.MeasureText(cb.GetItemText(cb.Items[i]), cb.Font).Width);
}
if (cb.Items.Count > cb.MaxDropDownItems) maxWidth += SystemInformation.VerticalScrollBarWidth
cb.DropDownWidth = maxWidth;
}
}
要使用 DataTable 进行测试:
DataTable t = new DataTable();
t.Columns.Add(new DataColumn("ID", typeof(int)));
t.Columns.Add(new DataColumn("Name2", typeof(string)));
t.Rows.Add(new object[] { 1, "Somename" });
t.Rows.Add(new object[] { 2, "Some other name" });
comboBox2.DisplayMember = "Name2";
comboBox2.ValueMember = "ID";
comboBox2.DataSource = t;
resizeCombo(comboBox2);
注意! 要使其正常工作,不要 在表单的构造函数中使用调整大小函数。一旦表单已经启动并且 运行.
从 Load 事件或类似事件中使用它
我想根据下拉项目中最长的字符串调整任何 ComboBox
下拉菜单的宽度。我希望它适用于任何 ComboBox
的项目,这意味着项目是字符串的项目、某些设置了 DisplayMember
的对象或 DataTable
。 I 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
中的所有字符串,而不管它们是如何添加的。有吗?
组合框有 GetItemText
方法,returns 项目的字符串表示。
这应该有效:
static void resizeCombo(ComboBox cb)
{
if (cb.Items.Count == 0) cb.DropDownWidth = cb.Width;
else
{
int maxWidth = int.MinValue;
for (int i = 0; i < cb.Items.Count; i++)
{
maxWidth = Math.Max(maxWidth, TextRenderer.MeasureText(cb.GetItemText(cb.Items[i]), cb.Font).Width);
}
if (cb.Items.Count > cb.MaxDropDownItems) maxWidth += SystemInformation.VerticalScrollBarWidth
cb.DropDownWidth = maxWidth;
}
}
要使用 DataTable 进行测试:
DataTable t = new DataTable();
t.Columns.Add(new DataColumn("ID", typeof(int)));
t.Columns.Add(new DataColumn("Name2", typeof(string)));
t.Rows.Add(new object[] { 1, "Somename" });
t.Rows.Add(new object[] { 2, "Some other name" });
comboBox2.DisplayMember = "Name2";
comboBox2.ValueMember = "ID";
comboBox2.DataSource = t;
resizeCombo(comboBox2);
注意! 要使其正常工作,不要 在表单的构造函数中使用调整大小函数。一旦表单已经启动并且 运行.
从 Load 事件或类似事件中使用它