如何让 DataGridView 中的列自动调整为 Combobox 的内容?

How can I get a column in a DataGridView to autosize to the contents of a Combobox?

我在 DataGridView 中有一个列类型为 DataGridViewComboBoxColumn 的列。在这个组合框中,我有几个不同长度的字符串。用户可以在应用程序设置中更改其中一些字符串。它看起来像这样:

列自动调整大小选项(例如 AllCells)与 DataGridViewTextBoxColumns 配合得很好。但是它们不能像预期的那样使用组合框。

如何设置此列的宽度以适应组合框的内容?

您可以使用 TextRenderer.MeasureText 计算项目的宽度,并将列宽设置为项目宽度的最大值。

要更改列宽,请使用 Width property of column. To change only width of dropdown menu, use DropDownWidth 属性。

// I suppose your column is at index 0
var c = this.dataGridView1.Columns[0] as DataGridViewComboBoxColumn;
c.Width = c.Items.Cast<Object>().Select(x => x.ToString())
    .Max(x => TextRenderer.MeasureText(x, c.InheritedStyle.Font,
        Size.Empty, TextFormatFlags.Default).Width);

您可以将以上代码放在您表单的 Load 事件处理程序中或您可能想要重置列大小的其他地方。

注意:在上面的示例中,组合框的项目应该是字符串类型。但是您可以使用任何类型的项目并提取项目的文本。这里的关键点是使用 TextRenderer.MeasureText 和那个参数。

VB版本

Dim c = DirectCast(Me.DataGridView1.Columns(0), DataGridViewComboBoxColumn)
c.Width = c.Items.Cast(Of Object)().Select(Function(x) x.ToString()) _
            .Max(Function(x) TextRenderer.MeasureText(x, c.InheritedStyle.Font, _
                Size.Empty, TextFormatFlags.Default).Width)