Изменение размера столбцов DataGridView без влияния на соседние? - PullRequest
3 голосов
/ 10 января 2012

Я хотел бы реализовать функцию, позволяющую пользователю изменять размер столбца DataGridView, но не затрагивая соседние столбцы.Я заметил во многих программах, что вы можете изменить размер определенного столбца, и все столбцы слева или справа останутся фиксированными в размере.Это не поведение по умолчанию в .NET, потому что, когда я раскрываю столбец, столбцы справа будут сжиматься в равных количествах, чтобы учесть добавленный размер старого столбца.

Есть ли способчтобы этого не случилось?

РЕДАКТИРОВАТЬ:

Я, очевидно, не объяснил, что лучше, поэтому давайте попробуем это снова:

У меня есть DataTable, который содержит 8 столбцови куча строк.Я добавляю эту DataTable как DataSource для DataGridView.Когда моя форма открывается, 8 столбцов равномерно распределяются по DataTable, для которого установлено значение AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;.Я хочу сохранить AutoSizeColumsMode таким образом.Форма или элемент управления не будут изменены.Только столбцы в элементе управления.

Я хочу, чтобы пользователь мог изменять размер отдельного столбца (например, столбца 3), не влияя на размер всех столбцов справа от него.,Поведение по умолчанию заключается в изменении размера всех остальных столбцов для размещения нового изменения.Тем не менее, я хотел бы изменить размер столбца сразу справа.Таким образом, он не испортит любые нестандартные размеры, которые были установлены в столбце 8.

Я видел, как приложение делало это раньше, сегодня, хотя хотелось бы вспомнить, какой это был, чтобы я мог сделать скриншот,Все, что я знаю, это то, что, когда я изменил размер одного столбца в середине таблицы, он не изменил ширину всех столбцов справа (только один рядом с ним).

1 Ответ

0 голосов
/ 10 января 2012
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;
    }    
}
...