Как добавить новую строку в 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 для текстовых полей, но иногда оно становится небольшим шумом. Предложения всегда приветствуются!