【问题标题】:How can I get a column in a DataGridView to autosize to the contents of a Combobox?如何让 DataGridView 中的列自动调整为 Combobox 的内容?
【发布时间】:2016-11-07 15:55:38
【问题描述】:

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

列 AutoSize 选项(例如 AllCells)可以很好地与 DataGridViewTextBoxColumns 配合使用。但它们不能按预期与组合框一起使用。

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

【问题讨论】:

    标签: c# vb.net winforms datagridview datagridviewcombobox


    【解决方案1】:

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

    要更改列的宽度,请使用列的Width 属性。要仅更改下拉菜单的宽度,请使用 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)
    

    【讨论】:

    • 如果您对答案有任何疑问,请告诉我:)
    • TextRenderer 是我缺少的类名。这是一个很好的方法。但它并不完全!它忽略了下拉箭头和一些内部填充。通过反复试验,我确定我的特定显示设置(字体大小为 14,所有其他默认值)需要额外的 22 像素用于填充。这个项目就够了!
    • 是的,您可能需要添加一些额外的空格,如填充等。还请查看列的DisplayStyleForCurrentCellOnly 属性。表示当当前单元格在此列时,DisplayStyle 属性值是否仅适用于DataGridView 控件中的当前单元格。
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2019-08-01
    • 2013-02-09
    相关资源
    最近更新 更多