Как найти исходную позицию в DataTable из отфильтрованного DataView

Я хочу найти определенный идентификатор в DataTable, я использую DataView для фильтрации результатов, но как узнать, какой строке в исходной таблице соответствует представление фильтра? Любые идеи? Я знаю, что могу использовать LINQ, но я не думаю, что это тоже поможет?

        Dim dt As New DataTable
        Dim dv As New DataView(dt)
        dv.RowFilter = "ID = 123"
        If dv.Count = 1 Then
            'which datarow in the original datatable is this?
        End If

ИЗМЕНИТЬ

Я хочу избежать необходимости перебирать DataTable, чтобы найти это:

        For r As Integer = 0 To dt.Rows.Count - 1
            If CInt(dt.Rows(r).Item("ID")) = 123 Then
                Debug.WriteLine("Found it at row " + r.ToString)
                Exit For
            End If
        Next

person Matt Wilko    schedule 05.08.2011    source источник
comment
Если в строке нет уникального идентификатора, я не уверен, что вы можете...   -  person Tim    schedule 05.08.2011


Ответы (1)


Нет ничего проще:

Dim dr As DataRow = dv(0).Row

http://msdn.microsoft.com/en-us/library/system.data.datarowview.row%28v=VS.100%29.aspx

Изменить: согласно вашему комментарию, вы можете использовать следующее, чтобы получить индекс строки

Dim rowIndex As Int32 = -1
For i As Int32 = 0 To dr.Table.Rows.Count - 1
    If dr.Table.Rows(i)("ID").Equals(dr("ID")) Then
        rowIndex = i
        Exit For
    End If
Next

Или вот так короче:

Dim rowIndex As Int32 = dr.Table.Rows.IndexOf(dr)

http://msdn.microsoft.com/en-us/library/system.data.datarowcollection.indexof.aspx

person Tim Schmelter    schedule 05.08.2011
comment
Да, это возвращает DataRow, но я хочу знать, какой номер строки (порядковый номер) находится в этой строке в DataTable. - person Matt Wilko; 05.08.2011
comment
@Matt: отредактировал мой ответ, но зачем тебе RowIndex? Обычно это не должно иметь значения. - person Tim Schmelter; 05.08.2011
comment
О прекрасное спасибо. Я создаю класс данных, который скрывает фактическую таблицу от вызова, поэтому, если он хочет обновить строку с идентификатором = 123, вызывающее приложение и класс не знают, где это находится в таблице. - person Matt Wilko; 05.08.2011
comment
@Matt: я до сих пор не понимаю, для чего вызывающему приложению и классу нужно знать индекс строки. DataAdapter.Update(DataTable) или DataAdapter.Update(DataRow) работает без индекса. - person Tim Schmelter; 05.08.2011
comment
Ну, вызывающее приложение находится в VB6, которое ничего не знает о строках данных. - person Matt Wilko; 05.08.2011