DataGridView AutoSize

Sib*_*Guy 13 .net winforms

有没有办法让DataGridView适合colums/rows的宽度和高度?我找到了需要手动计算的解决方案:http://www.codeguru.com/csharp/.net/net_data/datagrid/article.php/c9603 DataGridView真的不支持这个功能吗?

Lar*_*rry 6

恕我直言,这是一个很老的问题,被误解了。Idsa 想要实现的是让实际的AutoSizewinforms 功能能够与 DataGridView 一起使用。该属性存在,但没有任何作用。

这意味着 DataGridView 必须适合内容,而不是其内容必须适合DataGridView内部。

要实现 AutoSize 实现,需要考虑很多事情。DataGridView 的大小取决于很多标准:

  • 边框尺寸
  • 填充
  • 单元格分隔符大小
  • 行标题高度
  • 列标题宽度
  • DataGridView 的填充方式(DataBound 或手动)
  • ... 多很多

最好的方法是选择一组适合您的特定场景的标准,并编写一些可以为您计算 DataGridView 大小的内容。

这里以我的具体场景为例:

  • 我的网格是数据绑定的。因此,每次 DataBinding 操作完成时,它的大小都会发生变化。这是触发重新计算 DataGridView 大小的条件。所以我把它和这个DataBindingComplete事件联系起来。

  • 我的网格不应该显示滚动条。所以我将该Scrollbars属性设置为“无”。

  • 我的行和列自动调整大小模式设置为 AllCells。

  • 行和列标题不可见。如果是,则它们的大小必须包含在计算中。

下面的扩展方法符合我的需要。这很简单,因为我的网格非常简单。您可能需要对其进行一些调整才能使其按照您的意愿工作,并且需要进行大量调整才能使其适用于每个 DataGridView 场景。

public static void HandleAutoSize(this DataGridView dgv)
{
    dgv.DataBindingComplete += (s, e) =>
    {
        var dg = (DataGridView)s;
        var width = dg.Columns.GetColumnsWidth(DataGridViewElementStates.None);
        var height = dg.Rows.GetRowsHeight(DataGridViewElementStates.None);

        dg.ClientSize = new Size(width, height);
    };
}
Run Code Online (Sandbox Code Playgroud)


lov*_*nce 5

如果要根据数据自动调整所有列的大小:

for (int i = 0; i < dataGridView.Columns.Count; i++)
{
    dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
Run Code Online (Sandbox Code Playgroud)

  • 我想要一个相反的事情:将控件自动调整为当前列大小 (2认同)
  • 不,我想保留原样. (2认同)
  • 不要问他是否可行。自己正确测试 (2认同)