Как добавить новую строку в datagridview только после заполнения определенных ячеек строки выше?

Я работаю над настольным приложением в C# (.NET 4.0). У меня есть сетка данных, заполненная пользовательскими объектами, через пользовательские (он наследует BindingList) BindingList (добавлены функции сортировки). Я использую события cellValidating для правильного увеличения первого столбца (ID) и проверки ввода в другие ячейки.

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

пример

ID     NAME      PRICE    ...

1      Beer       2.6

2      Cheese      3.3

_      _______     ____      <- empty row

Теперь, если я нажимаю (ввод), для нового идентификатора строки автоматически устанавливается значение 3, а если я оставляю щелчок по ячейке "Пиво", новый идентификатор строки становится пустым, а все значения по умолчанию пусты (именно так и должно работать и работает). Проблема в том, что если щелкнуть / ввести новую строку и ввести что-то для имени (и даже если я удалю содержимое перед тем, как покинуть ячейку), под этой строкой будет добавлена ​​новая строка, которая была новой строкой. Таким образом, эта строка добавляется в BindingList и является неполной, ее не следует добавлять до тех пор, пока все необходимые ячейки не будут правильно заполнены (например, цена).

Я понятия не имею, как это сделать. Пожалуйста, помогите мне, я совсем новичок в C#.

Спасибо за ваше время и ответы.

2 ответа

Решение

Вы должны справиться с RowValidating событие и отменить обработку события после проверки конкретных условий (правила проверки). Тогда текущая введенная строка не будет зафиксирована в DataGridView, и новая строка не будет добавлена.

Например:

if (dgv[0, e.RowIndex].Value == DBNull.Value)
{
    dgv.Rows[e.RowIndex].ErrorText = "You must enter a value for this field!";

    // Tell the DataGridView not to accept this row
    e.Cancel = true;
}

Если вы разрабатываете приложение для Windows и у вас есть текстовые поля для получения ввода от пользователя для обновления в DataGridView, вы можете сделать это в самом C#, учтите следующее:

if(txtNAME.Text.Trim()!=String.Empty&&txtPRICE.Text.Trim()!=String.Empty)
{
  MessageBox.Show("Invalid type of input","Alert", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

else
{
  SqlConnection _sqlconnectionOne=new SqlConnection(*DatabaseConnectionString*);

  SqlCommand _sqlcommandOne=new SqlCommand();

  _sqlcommandOne.CommandType=CommandType.Text;
  _sqlcommandOne.CommandText="*INSERTStatement*";
  _sqlcommandOne.Connection=_sqlconnectionOne;
  _sqlcommandOne.ExecuteNonQuery();

  SqlConnection _sqlconnectionSecond=new SqlConnection(*DatabaseConnectionString*);

  SqlCommand _sqlcommandSecond=new SqlCommand();

  _sqlcommandSecond.CommandType=CommandType.Text;
  _sqlcommandSecond.CommandText="*SELECT*Statement*";
  _sqlcommandSecond.Connection=_sqlconnectionSecond;

  SqlDataAdapter _sqldataadapter=new SqlDataAdapter(_sqlcommandSecond);

  DataTable _datatable=new DataTable();

  _sqldataadapter.fill(_datatable);
  *DataGridViewName*.DataSource=_datatable;
}

Или вы можете использовать событие Leave для текстовых полей, но иногда оно становится небольшим шумом. Предложения всегда приветствуются!

Другие вопросы по тегам