DataGridView列自动调整宽度和可调整大小

8

我想知道是否有可能使dataGridView列根据其内容自动调整宽度,并同时允许用户调整大小?

以下是我迄今为止尝试过的方法:

dataGridView.AllowUserToResizeColumns = true;
dataGridView.Columns[0].AutoSizeMode=DataGridViewAutoSizeColumnMode.DisplayedCells;
dataGridView.Columns[0].Resizable = DataGridViewTriState.True;

但是,我仍然无法手动调整列的大小。

如果有人已经遇到这个问题或者有任何想法,请告诉我。

谢谢。


默认情况下,DataGridView的列不可调整大小吗?如果删除所有这些代码会发生什么?你能调整它们的大小吗? - Axarydax
是的,列是可调整大小的。我的数据网格中有其他可调整大小的列。但是,一旦我将AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells设置为某一列,这个特定的列就不再可调整大小,而其他列仍然可以。 - wallou
6个回答

20

我终于找到了实现我想要的功能的方法。

思路是:

  • dataGridView自适应列宽以适应内容,然后
  • 更改AutoSizeColumnMode并使用刚存储的值设置宽度。

以下是代码:

dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
int widthCol = dataGridView.Columns[i].Width;
dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
dataGridView.Columns[i].Width = widthCol;

希望这能帮到你。


1
你可以使用这个简单的代码:

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);

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


我认为OP问题的要点在于,当使用显示的单元格调整大小模式时,DGV将不允许手动调整列大小。至少对我来说也是如此 - 这就是我来到这里的原因。 - jwilo
实际上,我认为这是正确和最佳的解决方案。它可以满足OP的要求。@jwilo,这个答案没有设置DGV.AutoSizeColumnsMode 属性。这确实可以防止手动调整列大小。这个答案调用了一个使用指定模式进行一次调整大小的方法。列(或网格)的自动调整大小模式保持不变,如果允许调整大小,则用户仍然可以调整大小。您可以在任何时候调用它,以便进行自动调整大小。 - ZbynekZ

1

在上面的代码基础上迭代所有列,并自动调整 DataGridView 的宽度。

//initiate a counter
int totalWidth = 0;

//Auto Resize the columns to fit the data
foreach (DataGridViewColumn column in mydataGridView.Columns)
{
    mydataGridView.Columns[column.Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    int widthCol = mydataGridView.Columns[column.Index].Width;
    mydataGridView.Columns[column.Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    mydataGridView.Columns[column.Index].Width = widthCol;
    totalWidth = totalWidth + widthCol;
}
//the selector on the left of the DataGridView is about 45 in width
mydataGridView.Width = totalWidth + 45; 

0

不太明显的一点(对我来说不是很明显)是,使用AutoSizeMode意味着我们希望大小被管理,这意味着用户不能进行调整大小。因此,我尝试并且似乎有效的方法是为每个列或大多数列使用DataGridView.AutoResizeColumn(请注意,它只会进行一次调整大小),然后将DataGridView.AllowUserToResizeColumns设置为true。可能还有其他变化,但重要的是,使用AutoSizeMode与允许用户调整大小是互斥的。


0
  • 感谢上面的解决方案(遍历DataGridView.Columns,将AutoSizeMode更改为有效值,收集宽度值并在更改AutoSizeModeDataGridViewAutoSizeColumnMode.None后将其设置回来)。
  • 我曾经苦苦挣扎,发现无论何时调用它都不起作用,除非是从类构造函数或任何Form.Show()Form.ShowDialog()之前的行中调用。所以我把这段代码片段放在Form.Shown事件中,这对我有用。
  • 我的转换后的代码,无论DataGridView.AutoSizeColumnsMode设置为什么,我都使用DataGridViewColumn.GetPreferredWidth()而不是更改DataGridViewColumn.AutoSizeMode并立即设置宽度值,然后再更改DataGridView.AutoSizeColumnsMode

    private void form_Shown(object sender, EventArgs e)
    {
            foreach (DataGridViewColumn c in dataGridView.Columns)
                c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true);
            dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    }
    
  • 一定要设置

            dataGridView.AllowUserToResizeColumns = true;
    
  • 我不知道为什么这只在显示窗体后才起作用。


-1

简单的解决方案:可以使用绑定字段或模板字段,您可以使用ItemStyle-Width

<asp:BoundField DataField="SSSS" HeaderText="XXX"  ItemStyle-Width="125px"/>
<asp:TemplateField HeaderText="EEEE" ItemStyle-Width="100px">

1
能否请您详细阐述您的答案并提供一个具体的例子?什么是“filed”?是应该写成“field”还是“file”?翻译完成后我会点赞的。 - Marcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接