在不影响相邻列的情况下调整DataGridView列的大小

本文关键字:调整 DataGridView 情况下 影响 | 更新日期: 2023-09-27 18:19:51

我想实现一个功能,允许用户调整DataGridView列的大小,但不影响相邻列。我在许多程序中注意到,您可以调整特定列的大小,并且左侧或右侧的所有列的大小都将保持不变。不过,这不是.NET中的默认行为,因为当我展开一列时,右侧的列将以相等的数量压缩,以考虑到旧列的添加大小。

有没有办法阻止这种情况的发生?

编辑:

我显然没有解释最好的,所以让我们再试一次:

我有一个DataTable,它包含8列和一堆行。我添加该DataTable作为DataGridView的DataSource。当我的窗体打开时,这8列均匀地分布在DataTable中,DataTable设置为AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;。我希望以这种方式保持AutoSizeColumsMode。表单或控件的大小将不会调整。只有控件中的列。

我希望用户能够调整单个列的大小(比如第3列),而不会影响其右侧所有列的大小。默认行为是调整所有其他列的大小以适应新的更改。但是,我希望它只立即向右调整列的大小。这样,它就不会破坏在第8列上设置的任何自定义尺寸。

今天早些时候,我看到一个应用程序做得很好,尽管我希望我能记得是哪个,这样我就可以截图了。我所知道的是,当我调整表中间一列的大小时,并没有改变所有列的宽度(只有紧挨着它的一列)。

在不影响相邻列的情况下调整DataGridView列的大小

public partial class Form1 : Form
{    
    int[] w = new int[100];
    public Form1()
    {
        InitializeComponent();
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;    
        Shown += new EventHandler(Form1_Shown);
    }
    void Form1_Shown(object sender, EventArgs e)
    {
        dataGridView1.ColumnWidthChanged += dataGridView1_ColumnWidthChanged;
        //to know what WERE the widths.
        for (int i = 0; i < dataGridView1.Columns.Count; i++) w[i] = dataGridView1.Columns[i].Width;
        //Won't work without this.
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    }    
    void dataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
    {
        int column = e.Column.Index;
        //unsubscribe so changing will not call itself.
        dataGridView1.ColumnWidthChanged -= dataGridView1_ColumnWidthChanged;
        //updating width.
        dataGridView1.Columns[column + 1].Width = (w[column + 1] + w[column]) - dataGridView1.Columns[column].Width;
        w[column + 1] = dataGridView1.Columns[column + 1].Width;
        w[column] = dataGridView1.Columns[column].Width;
        //re-subscribe
        dataGridView1.ColumnWidthChanged += dataGridView1_ColumnWidthChanged;
    }    
}