C# DataGridView, Добавляющий строку - При проверке, как я знаю строку, является новым и еще зафиксированным?

У меня есть клиент, имеющий проблему с DataGridView в Приложении Windows. Они называют событие CellValidated, но они хотят иметь другую проверку для ячейки, если это подряд, который уже передается назад источнику данных, чем если бы это - строка, которая сначала добавляется (и еще не фиксируется (пользователь еще не покинул строку). Я попробовал свойство IsNewRow, но как только Вы начинаете вводить в строке, другая "новая строка" добавляется, таким образом, строку, с которой Вы работаете, больше не считают новой строкой. Я знаю, что строка еще не фиксировалась, потому что можно поразить Esc для отмены редактирования, и вся строка уходит.

Существует ли способ сказать, является ли в настоящее время редактируемая строка на самом деле "новой строкой" в том смысле, что это не было передано назад источнику данных?

7
задан Charles Boyung 3 February 2010 в 06:02
поделиться

3 ответа

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

if (this.DATASET.DATATABLE.Rows.Count == e.RowIndex)

Этот оператор if работает, потому что до выхода из строки в DataGridView он еще не существует в таблице данных, поэтому количество строк в таблице данных будет равно RowIndex для новой строки, поскольку RowIndex отсчитывается от нуля.

0
ответ дан 7 December 2019 в 07:45
поделиться

Один из способов, которым я достиг чего-то подобного в прошлом, это использовать свойство ID моих объектов, связанных с списком.

Например, если у меня есть BindingList , где пользователь является чем-то вроде:

public class Names
{
    public string Name { get; set; }         
    public int id { get; set; }
}

, я могу связать мой список, как это:

dataGridView1.AutoGenerateColumns = false;
_users = new BindingList<User>();
_users .Add(new Names() { Name = "joe", id=1 });
_users .Add(new Names() { Name = "pete", id = 2 });

bindingSource1.DataSource = _names;

DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
col1.DataPropertyName = "Name";        

dataGridView1.Columns.Add(col1);

dataGridView1.DataSource = _users;

, тогда, когда DataGridView обеспечивает новую строку , он будет иметь идентификатор 0 (значение по умолчанию для целого числа).

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

Также может быть способ достичь этого с использованием Bindingsources, но у меня был быстрый взгляд на свойства там, и у меня ничего не вышла.

3
ответ дан 7 December 2019 в 07:45
поделиться

Каков источник данных в этом случае?

Если это таблица данных, то вы можете легко протестировать свойство DataRowState строк таблицы данных, чтобы увидеть, новые они или существующие. После того, как вы проверили свои строки данных, вы можете затем вызвать Accept для table для фиксации этих строк. В этой ситуации нет необходимости вмешиваться между сеткой и ее данными.

Конечно, это не означает, что ваши данные на самом деле передаются в базу данных, если в конечном итоге они хранятся там. Это был бы еще один шаг.

Кроме того, я обычно избегаю прямой записи в datagridview; вместо этого я делаю его доступным только для чтения и открываю экран добавления / ввода, который может выполнить любую требуемую проверку.

Не знаю, было ли что-то из этого вам полезно - если я упустил суть, дайте мне знать.

3
ответ дан 7 December 2019 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: