调整DataGridView列的大小而不影响相邻的列?

时间:2012-01-10 15:39:42

标签: c# winforms datagridview datagridviewcolumn

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

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

编辑:

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

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

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

我今天早些时候看到一个应用程序正确执行此操作,但我希望我能记住它是什么,所以我可以截取屏幕截图。我所知道的是,当我在表格中间调整一列时,它并没有改变所有列的宽度(仅紧邻它旁边的一列)。

1 个答案:

答案 0 :(得分:0)

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;
    }    
}