我遇到了一种相当奇怪的行为。
在我的表单后面,我有我的构造函数,如下所示:
Private Property SourceDatatable As DataTable
Public Sub New()
' This call is required by the designer.
InitializeComponent()
SourceDatatable = GetData()
'SourceDatatable now has 500 rows
AvailableObjects.DataSource = SourceDatatable
End Sub
现在,所有500行都在gridview中可见。 当用户单击按钮时,所选行将被复制'
Private Sub CopyObject_Click(sender As System.Object, e As System.EventArgs) Handles AddNewObject.Click
Dim selectedRow As Integer = GridviewAvailableObjects.GetSelectedRows().FirstOrDefault()
If (selectedRow > 0) Then
Dim selectedDataRow As Integer = GridviewAvailableObjects.GetRowHandle(selectedRow)
SelectedRecords.Rows.Add(SourceDatatable.Rows(selectedDataRow))
End If
GridViewSelectedValues.RefreshData()
End Sub
错误发生在SourceDatatable.Rows(selectedDataRow)
。突然它有0 rows
,但selectedDataRow
指的是数据源(数据表)中的正确行。不存在其他方法/代码的干扰,因为这两种方法是表单上唯一存在的方法,并且有no other code on this form
。也不能从表格外部访问网格或任何控件。
什么可能导致这种奇怪的行为? de Devexpress Gridview
是否对数据源做了什么?
答案 0 :(得分:1)
由于DataTable限制,您不应该直接从一个表添加行到另一个表 - 它会抛出System.ArgumentException
(“此行已经属于另一个表”)异常。这个问题is not specific到DevExpress GridView。您可以通过简单地将原始行中的“值”复制到另一个表中来避免它。
此版本的“复制”对我有用,请查看:
void btnCopy_Click(object sender, EventArgs e) {
var selectedRowHandles = gridViewForAllData.GetSelectedRows();
for(int i = 0; i < selectedRowHandles.Length; i++) {
var selectedRow = gridViewForAllData.GetDataRow(selectedRowHandles[i]);
selectedRowsTable.Rows.Add(selectedRow.ItemArray);
}
gridViewForSelectedValues.RefreshData();
}
VB.Net:
Private Sub btnCopy_Click(ByVal sender As Object, ByVal e As EventArgs) Handles simpleButton1.Click
Dim selectedRowHandles = gridViewForAllData.GetSelectedRows()
For i As Integer = 0 To selectedRowHandles.Length - 1
Dim selectedRow = gridViewForAllData.GetDataRow(selectedRowHandles(i))
selectedRowsTable.Rows.Add(selectedRow.ItemArray)
Next i
gridViewForSelectedValues.RefreshData()
End Sub