设置 DataGridView ComboBoxColumn 的下拉列表宽度 - WinForms

问题描述 投票:0回答:4

我有一个带有组合框列的数据网格视图。此列是数据绑定的。我想根据列表中最大项目的宽度设置下拉列表的宽度。对于普通的组合框来实现相同的效果,我使用了一种扩展方法,该方法将通过查找列表中最大宽度的项目来设置组合框的宽度。这是在组合框的 DropDown 事件中完成的。

现在在 DataGridView 组合框列中我想实现相同的目标。在这种情况下如何获取 DropDown 事件?如果还有其他方法可以达到同样的效果,请告诉我?

c# winforms datagridview drop-down-menu datagridcomboboxcolumn
4个回答
7
投票

经过一番调查,我找到了答案。

我将数据源设置为 datagridview 的组合框列。因此,设置数据源后,我找到数据表中最大项目的宽度,该值设置为列的 DisplayMember。我在我的问题中使用了上面给出的链接中提到的相同逻辑,而不是在 DropDown 事件中执行此操作,而是在设置数据源时执行此操作,这是一次性的。在上面给出的链接中,我的问题是每次显示下拉列表时设置下拉列表的宽度。所以,在某种程度上,我的方法看起来不错。

这里,我是如何做到这一点的:

// This line is picked up from designer file for reference
  DataGridViewComboBoxColumn CustomerColumn; 

  DataTable _customersDataTable = GetCustomers();

  CustomerColumn.DataSource = _customersDataTable;
  CustomerColumn.DisplayMember = Customer_Name;
  CustomerColumn.ValueMember = ID;

  var graphics = CreateGraphics();

  // Set width of the drop down list based on the largest item in the list
  CustomerColumn.DropDownWidth = (from width in
                         (from DataRow item in _customersDataTable.Rows
                          select Convert.ToInt32(graphics.MeasureString(item[Customer_Name].ToString(), Font).Width))
                       select width).Max();

1
投票

您可以尝试将列的

AutoSizeMode
设置为
AllCellsExceptHeader
AllCells
。 如果自动调整大小导致列变得太窄,您还可以设置列的
MinimumWidth


1
投票

您只需设置 DataGridView 列的 DropDownWith 属性即可:

this.myColumnDataGridViewComboBoxColumn.DropDownWidth = 变量;

对于变量,您可以使用sql查询来获取表中列的较大大小。


0
投票

@JPReaddy 让我完成了大部分工作(谢谢@JPReddy!),但该解决方案仅扩展了下拉部分,而不是实际的列。 如果目标是使列的大小与列表中最宽的项目相同,则您必须考虑下拉按钮本身以及更多一点。

这是我觉得视觉上最令人愉悦的:

// Set width of the drop down list based on the largest item in the list
int colWidth = ( int )Math.Round( ( double )( from width in
                   ( from DataRow item in _customersDataTable.Rows
                          select Convert.ToInt32( graphics.MeasureString( item[Customer_Name].ToString( ), Font ).Width ) )
                                                select width ).Max( ) + SystemInformation.VerticalScrollBarWidth + 10 );

col.DropDownWidth = col.MinimumWidth = colWidth;
© www.soinside.com 2019 - 2024. All rights reserved.