我有一个包含小表的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吗?
答案 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.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
,因此DataGridViewRow.DataBoundItem
属性将为DataRow
。请查看上面的对象帮助主题以获取示例。
DataGridView类 at http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.aspx
DataGrid类位于http://msdn.microsoft.com/en-us/library/system.windows.forms.datagrid.aspx
保留DataGrid控件 向后兼容性和特殊性 需要。对于几乎所有目的,你 应该使用DataGridView控件。 唯一可用的功能 DataGrid控件不是 在DataGridView控件中可用 是分层显示 来自两个相关表格的信息 单一控制。你必须使用两个 DataGridView控件显示 来自两个表的信息 在主/细节关系中。