Проверка DataGridView и изменение значения ячейки - PullRequest
23 голосов
/ 20 января 2011

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

Я могу правильно проверить свое значение, но когда я пытаюсь изменить его на что-то действительное, я получаю DataError. Вот мой код:

        private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        Console.WriteLine("Validating");
        DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex];
        DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
        if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode)
        {
            Console.WriteLine("   Batch Column");
            DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'"
                , comboBox1.SelectedValue, e.FormattedValue));
            if (rows.Length == 1)
            {
                Console.WriteLine("      Auto Completed item from list: {0}", rows[0]["Batch"]);
                //e.Cancel = true;
                cell.Value = rows[0]["Batch"];
                //this.unit_List_2_GroupsDataGridView.EndEdit();
            }
            else
            {
                Console.WriteLine("     No Autocomplete!");
                int i = 0;
                if (!int.TryParse(e.FormattedValue.ToString(), out i))
                {
                    Console.WriteLine("         Not an integer either");
                    e.Cancel = true;
                }
            }
        }
    }

Строка, которая читает cell.Value = row [0] ["Batch"]; не выполняет то, что я ожидаю.

Ответы [ 2 ]

42 голосов
/ 20 января 2011

Событие CellValidating происходит непосредственно перед тем, как DataGridView выходит из режима редактирования; это событие, которое связано с элементом управления редактированием (DataGridView.EditingControl). Никогда не пытайтесь изменить значение ячейки в обработчике для этого события, потому что, если вы не отмените событие (в этом случае пользователь застревает в режиме редактирования), значение ячейки устанавливается равным значению из элемента управления для редактирования сразу после Событие заканчивается. Поэтому это отменяет любое действие, выполняемое вами в обработчике.

Вместо этого вам нужно изменить значение в элементе управления редактированием (помня о том, чтобы не отменять событие). Например, для DataGridViewTextBoxCell вы должны использовать следующую строку вместо проблемной:

unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);

Вы должны найти, что это решает вашу проблему.

4 голосов
/ 21 ноября 2013

В общем случае лучше использовать событие CellParsing всякий раз, когда вам нужно преобразовать / изменить значение в ячейке. Из этого события вы можете указать, что значение пользователя недопустимо, установив ErrorText значение ячейки или строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...