DataGridViewComboBoxColumn установка выбранного индекса

Я просто не могу заставить это работать. У меня есть datagridview в winforms, и в этом одном из моих столбцов находится DataGridViewComboBoxColumn.

В своем конструкторе я настроил его так

DataGridViewComboBoxColumn column = (DataGridViewComboBoxColumn)RectangleGrid.Columns["Material"];

        DataTable data = new DataTable();

        data.Columns.Add(new DataColumn("Value", typeof(int)));
        data.Columns.Add(new DataColumn("Description", typeof(string)));

        foreach (Materials M in DataStructure.Active.Active_Materials)
        {
            data.Rows.Add(M.MaterialNr, (M.MaterialNr + 1).ToString() + " " + M.Material.Name);
        }

        column.DataSource = data;
        column.ValueMember = "Value";
        column.DisplayMember = "Description";

И это действительно хорошо работает, за исключением того, что в раскрывающемся списке ничего не выбрано, что мне нужно. Я искал это в Google и, например, пробовал этот подход: http://goo.gl/kBy8W, но безуспешно, потому что EditingControlShowing происходит только тогда, когда я щелкаю поле, а не когда оно появляется впервые (поэтому я могу установить выбранный индекс после его нажатия, но это бесполезно). Версия CellFormatting по крайней мере изменяет значение, но просто помещает туда строку, а не мой первый индекс из моего источника данных.

Я тоже пробовал это

column.DefaultCellStyle.NullValue = data.Rows[0]["Description"];
column.DefaultCellStyle.DataSourceNullValue = data.Rows[0]["Value"];

и это, казалось, сработало, но затем, когда я выбрал первый индекс в раскрывающемся списке (так что опустите раскрывающийся список, а затем выберите первый индекс, а затем удалите ячейку), я получил сообщение об ошибке от ParseFormattedValue, где говорится, что он не может преобразовать "значение" в system.String.

Было это, казалось, на правильном пути, но я не мог заставить его работать: http://goo.gl/VevA3


person Rickard Liljeberg    schedule 12.12.2012    source источник


Ответы (1)


Я закончил тем, что «решил» это в очень грязном решении, которое мне не нравится, но вроде работает.

Мой datagridview был привязан к datatable (а не к базе данных), поэтому я подключил обработчик событий к событию TableNewRow в datatable.

затем я сделал это в этом обработчике событий

    private void NewRectangleInserted(Object sender, DataTableNewRowEventArgs e)
    {
        if (e.Row[0].ToString() == "")
        {
            e.Row[0] = 0;
        }
    }

Итак, в основном, когда создается новая строка, я устанавливаю значение поля со списком на 0, если пользователь не создал строку, добавив значение в этой конкретной ячейке (почему я проверяю, равно ли оно "")

В результате, как только вы выделяете новую строку или любую ячейку в строке, поле со списком заполняется. Однако новая строка в нижней части по-прежнему имеет пустое поле со списком, пока вы не выделите ее.

не идеально, но намного лучше. К сожалению, это нужно было делать с помощью хака!

person Rickard Liljeberg    schedule 14.12.2012
comment
вы можете использовать это if (string.IsNullOrEmpty(e.Row[0].ToString())), чтобы убедиться, что строка либо пуста, либо пуста :) - person spajce; 14.12.2012
comment
Блестяще! Я кое-что узнал сегодня, а она еще не обеденный перерыв ;-) - person Rickard Liljeberg; 14.12.2012
comment
тогда вы можете +1 к моему комментарию;) - person spajce; 14.12.2012