无论数据源类型如何,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 事件或类似事件中使用它