代码之家  ›  专栏  ›  技术社区  ›  ZeissS

如何在已排序的数据视图中获取正确的行?

  •  0
  • ZeissS  · 技术社区  · 14 年前

    我有一个包含一个小表的数据报。到目前为止,我在此网格上有一个双击处理程序,它遍历所有行以查找所选的行:

    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 回复  |  直到 14 年前
        1
  •  1
  •   AMissico    14 年前

    数据报(Windows)

    尝试 DataGrid.GetSelectedDataRows 以下,何处 MyBase 是你的名字 DataGrid .

        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
    

    数据表格控件

    使用 SelectedRows 财产。它返回 DataGridViewRow 物体。既然你知道你在绑定 DataTable , the DataGridViewRow.DataBoundItem 属性将是 DataRow . 查看上面的对象帮助主题以获取示例。

    工具书类

    摘录

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

        2
  •  1
  •   Thorsten Dittmar    14 年前

    为什么不使用 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
    }