【问题标题】:XtraGrid Move Grid Row Up and DownXtraGrid 上下移动网格行
【发布时间】:2015-08-27 05:04:15
【问题描述】:

正如DevExpress thread 中所述,我能够上下移动网格行。但是,一旦我从具有 Primary Key 约束的数据库中添加表,它就停止了工作。抛出异常:

列“Id”被限制为唯一。值“101”已经存在

这是我的 MoveDown 代码:

Private Sub BtnMveDwn_Click(sender As Object, e As EventArgs) Handles BtnMveDwn.Click

    Dim lObjGrdVew As GridView
    Dim lObjDtaTbl As DataTable
    Dim lIntIndex As Integer
    Dim lObjTmpRow As Object
    Try
        lObjGrdVew = CType(GrdCntrlMain.FocusedView, GridView)
        lObjDtaTbl = TryCast(GrdCntrlMain.DataSource, DataTable)
        lIntIndex = lObjGrdVew.FocusedRowHandle

        lObjGrdVew.GridControl.Focus()

        If lIntIndex >= lObjGrdVew.DataRowCount - 1 Then
            Return
        End If

        lObjTmpRow = lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex + 1)).ItemArray

        lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex + 1)).ItemArray = lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex)).ItemArray

        lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex)).ItemArray = lObjTmpRow

        lObjGrdVew.FocusedRowHandle += 1
        lObjGrdVew.UnselectRow(lObjGrdVew.FocusedRowHandle - 1)
        lObjGrdVew.SelectRow(lObjGrdVew.FocusedRowHandle)

    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try

End Sub

至于这个thread,我没有尝试过,但是如果列数更高,我必须遍历所有列。即循环。

谢谢

编辑 1 请不要拖放代码。我正在点击按钮。


编辑 2 这儿存在一个问题!我有带有暗淡可见的 展开 按钮的行。就像,如果存在子行,则展开按钮将正确可见但暗淡,就像正常的网格行为一样。但是当交换行时,展开按钮不会改变它们的状态,这是错误的和不可取的。你能解决这个问题吗?

【问题讨论】:

    标签: .net vb.net devexpress xtragrid


    【解决方案1】:

    您需要使用DataTable.BeginLoadData 方法和DataTable.EndLoadData 方法。 DataTable.BeginLoadData 方法在加载数据时关闭通知、索引维护和约束,DataTable.EndLoadData 将其打开。
    这是一个例子:

    Private Sub BtnMveDwn_Click(sender As Object, e As EventArgs) Handles BtnMveDwn.Click
    
        Dim lObjGrdVew As GridView
        Dim lObjDtaTbl As DataTable
        Dim lIntIndex As Integer
        Dim lObjTmpRow As Object
        Try
            lObjGrdVew = CType(GrdCntrlMain.FocusedView, GridView)
            lObjDtaTbl = TryCast(GrdCntrlMain.DataSource, DataTable)
            lIntIndex = lObjGrdVew.FocusedRowHandle
    
            lObjGrdVew.GridControl.Focus()
    
            If lIntIndex >= lObjGrdVew.DataRowCount - 1 Then
                Return
            End If
    
            lObjTmpRow = lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex + 1)).ItemArray
    
            lObjDtaTbl.BeginLoadData '<= turn off constraints
    
            lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex + 1)).ItemArray = lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex)).ItemArray
    
            lObjDtaTbl(lObjGrdVew.ViewRowHandleToDataSourceIndex(lIntIndex)).ItemArray = lObjTmpRow
    
            lObjDtaTbl.EndLoadData '<= turn on constraints
    
            GrdCntrlMain.RefreshDataSource() '<= update GridControl to reflect the changes
    
            lObjGrdVew.FocusedRowHandle += 1
            lObjGrdVew.UnselectRow(lObjGrdVew.FocusedRowHandle - 1)
            lObjGrdVew.SelectRow(lObjGrdVew.FocusedRowHandle)
    
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    
    End Sub
    

    编辑 2 您需要使用GrdCntrlMain.RefreshDataSource 更新您的GridControl,以便您的基础数据源中的更改将正确反映在您的DataControl 中。

    【讨论】:

    • 谢谢,它正在工作!根据这个msdn.microsoft.com/en-us/library/s3bxwk8b.aspx你也可以使用dataSet1.EnforceConstraints = False之后,dataSet1.EnforceConstraints = True
    • @FaizanMubasher 是的,但在你的问题中,DataSet 没有任何内容。
    • 我知道!我刚刚在你回答之前找到了它:-)。没关系
    • 有问题!我有带有暗淡可见的 Expand 按钮的行。就像,如果存在子行,则展开按钮将正确可见但暗淡,就像正常的网格行为一样。但是当交换行时,展开按钮不会改变它们的状态,这是错误的和不可取的。你能解决这个问题吗?
    • @FaizanMubasher 尝试在两行上使用GridView.InvalidateRow 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多