Как установить выбранную строку DataGridView в новую добавленную строку, когда сетка привязана к отсортированному DataView?

У меня есть DataGridView, связанный с DataView. Сетка может быть отсортирована пользователем по любому столбцу.

Я добавляю строку в сетку, вызывая NewRow в базовом DataTable DataView, а затем добавляя ее в коллекцию Rows DataTable. Как я могу выбрать только что добавленную строку в сетке?

Я попытался сделать это, создав объект BindingManagerBase, связанный с BindingContext объекта DataView, а затем установив BindingManagerBase.Position = BindingManagerBase.Count. Это работает, если сетка не отсортирована, так как новая строка добавляется в конец сетки. Однако если порядок сортировки таков, что строка не добавляется в конец, это не работает.

Как я могу надежно установить выбранную строку сетки в новую строку?


person Phillip Wells    schedule 10.10.2008    source источник
comment
У меня такая же проблема stackoverflow .com/questions/1664537/   -  person Ruben Trancoso    schedule 03.11.2009


Ответы (3)


Как только вы обновите привязанную таблицу DataTable, элемент управления DataGridView запустит событие RowsAdded со свойством DataGridViewRowsAddedEventArgs.RowIndex, содержащим индекс добавленной строки.

//local member
private int addedRowIndex;

private void AddMyRow()
{
    //add the DataRow           
    MyDataSet.MyDataTable.Rows.Add(...);

    //RowsAdded event is fired here....

    //select the row
    MyDataGrid.Rows[addedRowIndex].Selected = true;
}

private void MyDataGrid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    addedRowIndex = e.RowIndex;
}

Возможно, не самое элегантное решение, но мне оно подходит

person stefano    schedule 26.01.2009
comment
это не работает, сортировка происходит до того, как вы получите rowIndex. Это будет последняя позиция в представлении для строк, добавленных с помощью Add или AddNew AFAIK. - person Ruben Trancoso; 03.11.2009

Не знаю, это лучшее решение, но, например, выглядит лучше, чем итерация.

            DataRowView drv = (DataRowView)source.AddNew();
            grupoTableAdapter.Update(drv.Row);
            grupoBindingSource.Position = grupoBindingSource.Find("ID", drv.Row.ItemArray[0]);
person Ruben Trancoso    schedule 03.11.2009

Предполагая, что у вас есть какой-то уникальный идентификатор в вашем источнике данных, вы можете перебирать свою коллекцию строк и сравнивать их как таковые:

Dim myRecentItemID As Integer = 3

For Each row As GridViewRow In gvIndividuals.Rows
    Dim drv As DataRowView = DirectCast(row.DataItem, DataRowView)
    If CInt(drv("ItemID")) = myRecentItemID Then
        gvIndividuals.EditIndex = row.RowIndex
    End If
Next

Надеюсь это поможет!

person Brendan Kendrick    schedule 16.10.2008
comment
Я не использую ASP.NET GridView, я использую Windows DataGridView. - person Phillip Wells; 23.10.2008