исправить ширину столбцов, когда список привязан к сетке данных - PullRequest
2 голосов
/ 17 марта 2010

У меня есть список, который я связал с представлением данных. Я хочу, чтобы первый столбец был фиксированного размера. Данные связаны с dataGridView, и я не могу найти способ получить доступ к свойствам отдельных столбцов. если я попробую myDatagridview.colums [0], я получу индекс вне границ, так как он говорит, что количество столбцов равно 0.

   private DataGridView setUpDataGrid(List<NVRlineVal> _NVRData)
    {
        //setup dataGridView
        DataGridView NVRDataGridView = new System.Windows.Forms.DataGridView();
        NVRDataGridView.ColumnHeadersHeightSizeMode =
            System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        NVRDataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
        NVRDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;


        NVRDataGridView.Name = "NVRDataGridView" + nvrIndex;
        NVRDataGridView.RowHeadersWidthSizeMode =
            System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
        NVRDataGridView.TabIndex = 0;
        NVRDataGridView.DataSource = _NVRData;
        //var clmn = NVRDataGridView.Columns[0];

        return NVRDataGridView;
    }

Любые идеи о том, как иметь фиксированную ширину столбца только для одного из этих столбцов, остальные будут автоматически изменять размер?

отредактировал оригинальный код, чтобы показать более очищенную версию, которая все еще работает

Ответы [ 3 ]

1 голос
/ 18 марта 2010

Я делаю что-то похожее, но с форматированием.

Проблема в том, что сетка не рисуется после настройки источника данных - вам нужно внести изменения в событие DataBindingComplete.

Вот некоторые фрагменты ....

(из https://minisqlquery.svn.codeplex.com/svn/trunk/MiniSqlQuery/QueryForm.cs)

- сетка по умолчанию:

        this.gridResults1.AllowUserToAddRows = false;
        this.gridResults1.AllowUserToDeleteRows = false;
        this.gridResults1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.ColumnHeader;
        this.gridResults1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.gridResults1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.gridResults1.Location = new System.Drawing.Point(3, 3);
        this.gridResults1.Name = "gridResults1";
        this.gridResults1.ReadOnly = true;
        this.gridResults1.Size = new System.Drawing.Size(1023, 242);
        this.gridResults1.TabIndex = 0;

- позже подпишитесь на DataBindingComplete событие:

grid.DataBindingComplete += GridDataBindingComplete;

- обработать событие (здесь я изменяю формат, но вы пытаетесь изменить ширину):

    private void GridDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        DataGridView grid = sender as DataGridView;
        if (grid == null)
        {
            return;
        }
        DataTable dt = grid.DataSource as DataTable;
        if (dt == null)
        {
            return;
        }

        string nullText = _settings.NullText;
        string dateTimeFormat = _settings.DateTimeFormat;

        for (int i = 0; i < dt.Columns.Count; i++)
        {
            if (dt.Columns[i].DataType == typeof (DateTime))
            {
                DataGridViewCellStyle dateCellStyle = new DataGridViewCellStyle();
                dateCellStyle.NullValue = nullText;
                dateCellStyle.Format = dateTimeFormat;
                grid.Columns[i].DefaultCellStyle = dateCellStyle;
            }
        }
    }
1 голос
/ 17 марта 2010
myDatagridview.colums[0] 

все будет хорошо, если вы используете его ПОСЛЕ привязки данных. когда я делаю что-то подобное, я устанавливаю ширину столбцов после того, как закончу весь код, касающийся данных.

Я предпочитаю не использовать авторазмер ни в заголовках.

0 голосов
/ 18 марта 2010

Используя ваш код, я нашел то, что работает.

Я отделил изменение размера столбца от потока создания, который, как я подозреваю, вызывается в конструкторе формы.

Вместо этого я поместил его в событие VisibleChanged формы.

Это работает для меня. обратите внимание, что для этого вам нужно будет разместить декларацию:

DataGridView NVRDataGridView

на уровне формы для доступа других методов, но вы можете оставить инициализацию в методе обновления.

private void Form1_VisibleChanged(object sender, EventArgs e)
        {
            if (this.Visible)
            {
                this.Invoke(new EventHandler(delegate
                {
                    if (NVRDataGridView.ColumnCount > 0)
                    {
                        NVRDataGridView.Columns[0].Width = 20;
                    }
                }));
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...