C # DataGridView Добавление строки. Как при проверке я узнаю, что строка новая и еще не зафиксирована? - PullRequest
7 голосов
/ 03 февраля 2010

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

Есть ли способ узнать, является ли текущая отредактированная строка «новой строкой» вЧувствуете, что он не был передан обратно в источник данных?

Ответы [ 4 ]

3 голосов
/ 04 февраля 2010

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

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

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

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

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

3 голосов
/ 03 февраля 2010

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

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

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, но я быстро осмотрел свойства и ничего не выпрыгнуло на меня.

1 голос
/ 15 июля 2013

Это должно помочь людям, которые не используют объекты DataTable:

В событии CellBeginEdit задайте для свойства Tag некоторое значение, которое вы будете использовать для дифференциации «новой» строки

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    if (e.RowIndex == dataGridView1.NewRowIndex)
        dataGridView1.Rows[e.RowIndex].Tag = true;
}

Затем в проверочном событии вы можете проверить это значение:

if (dataGridView1.Rows[e.RowIndex].Tag is bool 
    && (bool) dataGridView1.Rows[e.RowIndex].Tag)
{
    // new row code

    // after it's added, mark it as 'not new'
    dataGridView1.Rows[e.RowIndex].Tag = false;
}
else
{
    // existing row code
}
0 голосов
/ 04 февраля 2010

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

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

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

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