如何自动调整DataGridView控件中的列并允许用户调整同一网格上的列的大小?

Stu*_*wig 107 c# datagridview winforms

我在Windows窗体上填充DataGridView控件(C#2.0而不是WPF).

我的目标是显示一个整齐地填充所有可用宽度的网格 - 即右侧没有未使用的(深灰色)区域,并根据其包含的数据适当地调整每列的大小,也允许用户调整任何列的大小他们喜欢.

我试图通过将每列的AutoSizeMode设置为DataGridViewAutoSizeColumnMode.AllCells来实现此目的,除了我设置为DataGridViewAutoSizeColumnMode.Fill的列之一,以确保网格的整个区域整齐地填充数据.(我不介意当用户尝试调整此列的大小时,它会弹回一个确保始终使用水平空间的大小.)

但是,正如我所提到的,一旦加载,我想允许用户调整列的大小以满足他们自己的要求 - 在为每个列设置这些AutoSizeMode值时,用户就无法再调整这些列的大小.

我试过没有设置允许调整大小的所有列的AutoSizeMode但是没有根据单元格包含的数据设置初始大小.加载数据后将网格的AutoSizeMode更改回"未设置"时会出现相同的结果.

是否有一个我在这里缺少的设置允许自动设置默认列宽和用户调整大小,还是在填充DataGridView控件时我必须使用另一种技术?

Mir*_*vec 126

这个技巧对我有用:

grd.DataSource = DT;

//set autosize mode
grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

//datagrid has calculated it's widths so we can store them
for (int i = 0; i <= grd.Columns.Count - 1; i++) {
    //store autosized widths
    int colw = grd.Columns[i].Width;
    //remove autosizing
    grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    //set width to calculated by autosize
    grd.Columns[i].Width = colw;
}
Run Code Online (Sandbox Code Playgroud)

这里发生的是你将自动调整大小设置为你需要的模式,然后逐列存储从自动调整计算得到的宽度,删除自动调整大小并将宽度设置为之前存储的值.

  • 这是很好的代码.需要放在'DataGridView1_DataSourceChanged'事件中. (5认同)
  • 我将类似的代码放入名为 AutoResizeColumnWidthsYetAllowUserResizing 的例程中。它在最初填充网格后以及用户编辑数据(即来自网格的 CellEndEdit 事件)后调用。 (2认同)
  • 对于c#类似,但带有方括号的`dataGridView1.Columns [i] .AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;` (2认同)

小智 44

也许你可以打电话

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);
Run Code Online (Sandbox Code Playgroud)

设置数据源后.它将设置宽度并允许调整大小.

有关MSDN DataGridView.AutoResizeColumns方法(DataGridViewAutoSizeColumnsMode)的更多信息.

  • 使用此解决方案我收到下一个错误:_"参数autoSizeColumnMode对此操作无效.它不能是NotSet,None或Fill,但需要指明大小调整标准."_.我最终使用了这个*dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;* (30认同)
  • 我不明白所有的upvotes ...这根本不起作用,[MSDN文档](http://msdn.microsoft.com/en-us/library/ms158594.aspx)很清楚,这样做会导致如果autoSizeColumnsMode的值为None或Fill,则为ArgumentException. (7认同)
  • 使用DataGridViewAutoSizeColumnMode.Fill不起作用,因为它在调整列大小时忽略单元格内容. (6认同)
  • 我不确定为什么这个答案没有得到更多的关注.更清洁.虽然如果你想要匹配单元格内容宽度DataGridViewAutoSizeColumnsMode.AllCells工作得更好一点. (2认同)
  • 我已将此方法与“DataGridViewAutoSizeColumnsMode.DisplayedCells”一起使用。此外,在表单设计器中,AutoSizeColumnsMode 设置为 None。我需要在 DataGridView 的 DataBindingComplete 事件处理程序中执行此方法调用,以确保它始终正确(重新)调整大小。 (2认同)

Tom*_*idd 31

AC#版本的Miroslav Zadravec的代码

for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
{
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

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

发布为社区维基,以免贬低他人的声誉


Jeh*_*hof 13

在我的应用程序中,我已设置

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
Run Code Online (Sandbox Code Playgroud)

另外,我已经设定了

grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;
Run Code Online (Sandbox Code Playgroud)

现在可以更改列宽,并且可以由用户重新排列列.这对我很有用.

也许这对你有用.


Sar*_*avu 11

将数据添加到网格后,添加以下代码,该代码将根据每个单元格中的数据长度调整列

dataGrid1.AutoResizeColumns();            
dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
Run Code Online (Sandbox Code Playgroud)

这是结果

在此输入图像描述

  • 对我来说很完美,谢谢 (2认同)

小智 8

好吧,我是这样做的:

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;
Run Code Online (Sandbox Code Playgroud)

在那个特定的顺序.列被调整大小(扩展)并且用户可以在之后调整列的大小.


Gor*_*ger 6

如果我正确地理解了这个问题,应该有一种更简单的方法来完成你所需要的.呼叫 dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

这应该够了吧.但是,有一个缺陷,因为在填充DataGridView控件后不能直接调用此方法.相反,您必须为VisibleChanged事件添加一个EventHandler并在那里调用该方法.


Ant*_*nio 5

问题的简历:让
列宽适应内容(跨列使用不同的方法),
然后允许用户设置列宽......

Miroslav Zadravec 的答案开发,对我来说,立即使用自动计算column.Width来设置...... column.Width

foreach (DataGridViewColumn column in dataGridView.Columns)
{
    if (/*It's not your special column*/)
    {
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        column.Width = column.Width; //This is important, otherwise the following line will nullify your previous command
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
    }
}

//Now do the same using Fill instead of AllCells for your special column
Run Code Online (Sandbox Code Playgroud)

这是测试工作时,DataGridView已经创建,使用这样一招这样


Ras*_*iya 5

简单的两行代码对我有用。

dataGridView.DataSource = dataTable;
dataGridView.AutoResizeColumns();
Run Code Online (Sandbox Code Playgroud)