Как установить выбранную строку DataGridView для вновь добавленной строки, когда сетка привязана к отсортированному DataView? - PullRequest
2 голосов
/ 10 октября 2008

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 26 января 2009

Как только вы обновляете связанный DataTable, событие «RowsAdded» вызывается элементом управления DataGridView, а свойство 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;
}

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

1 голос
/ 03 ноября 2009

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

            DataRowView drv = (DataRowView)source.AddNew();
            grupoTableAdapter.Update(drv.Row);
            grupoBindingSource.Position = grupoBindingSource.Find("ID", drv.Row.ItemArray[0]);
0 голосов
/ 16 октября 2008

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

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

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

...