Gridview-Datasource:Datatable丢失所有行

时间:2014-06-25 14:49:34

标签: vb.net gridview devexpress

我遇到了一种相当奇怪的行为。

在我的表单后面,我有我的构造函数,如下所示:

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是否对数据源做了什么?

1 个答案:

答案 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