如何在已排序的DataView中获取正确的行?

时间:2010-06-02 11:33:09

标签: .net winforms forms datagrid

我有一个包含小表的DataGrid。到目前为止,我在这个网格上有一个双击处理程序,它迭代所有行以找到所选行:

DataTable table = (DataTable)this.dataGrid.DataSource;
int selectedRow = -1;
for (int i=0; i<table.Rows.Count; i++)
  if (this.dataGrid.IsSelected(i))
    selectedRow = i;
    break;
  }
if ( selectedRow != -1 ) {
  DataRow row = table.Rows[selectedRow];
  // More code ...
}

问题:当用户单击列标题并对表进行排序时,table.Rows不会返回正确的行。它仍然包含未排序的行。

如何获得正确的专栏?

编辑1:我有System.Windows.Forms.DataGrid,而不是DataGridView。我不知道区别,因为我不太了解.Net。我可以简单地用DataGridView替换DataGrid吗?

2 个答案:

答案 0 :(得分:1)

为什么不使用DataGridView.SelectedRows属性?然后使用DataBoundItem来访问这些行以访问基础数据。这可能是DataRowView类型。在这种情况下,请使用DataRowView.Row属性。

foreach (DataGridViewRow dgvrow in dataGrid.SelectedRows)
{
  DataRow row = null;
  if (dgvrow.DataBoundItem is DataRowView)
    row = (dgvrow.DataBoundItem as DataRowView).Row as DataRow;
  else
    row = dgvrow.DataBoundItem as DataRow;

  // ... stuff
}

答案 1 :(得分:1)

DataGrid(Windows)

请尝试下面的DataGrid.GetSelectedDataRows,其中MyBaseDataGrid的名称。

    Public Function GetSelectedDataRows() As DataRow()
        Dim oSelectedRows As New ArrayList
        Dim oDataTable As DataTable = DirectCast(MyBase.DataSource, DataTable)
        For i As Integer = 0 To oDataTable.Rows.Count - 1
            If MyBase.IsSelected(i) Then
                oSelectedRows.Add(oDataTable.DefaultView(i).Row)
            End If
        Next
        Return DirectCast(oSelectedRows.ToArray(GetType(DataRow)), DataRow())
    End Function

的DataGridView

使用SelectedRows属性。它返回DataGridViewRow个对象的集合。由于您知道自己绑定了DataTable,因此DataGridViewRow.DataBoundItem属性将为DataRow。请查看上面的对象帮助主题以获取示例。

参考

摘录

  

保留DataGrid控件   向后兼容性和特殊性   需要。对于几乎所有目的,你   应该使用DataGridView控件。   唯一可用的功能   DataGrid控件不是   在DataGridView控件中可用   是分层显示   来自两个相关表格的信息   单一控制。你必须使用两个   DataGridView控件显示   来自两个表的信息   在主/细节关系中。