Datagridview:行在更新后移动,为什么?

Datagridview : row moves after an update, why?

我使用 visual basic 2010 环境在 vb.net 代码中创建了一个应用程序,但我在 datagridview 方面遇到了一点问题。有关更多详细信息,我已经使用连接器 odbc 连接了一个 postgresql 数据库,它工作正常。我可以轻松地插入、更新、删除数据,但是在更新之后并且只有在更新查询之后,datagridview 才会显示我的所有数据,但是更新的行会自动移动到最后一个位置。为什么 ?如果我在 PGadmin 3 中查看我的数据库,我没有这个问题,它显示了排序的行 ascending.Personally 我已经搜索了解决方案,但我找到了任何东西。我会用截图说明我的情况:

加载表单时,这是我的应用程序: 第一张图片=> https://drive.google.com/file/d/0B_Lx61Af8AuUNUs4TDlWMnBIblE/view?usp=sharing

如您所见,行是按升序排列的。 这是 "accueil" 形式的代码:

Imports System.Data.Odbc

Public Class accueil

    Dim database As String = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=formation;Uid=postgres;Pwd=test;"

    Dim CON As OdbcConnection
    Dim CMD As OdbcCommand
    Dim RD As OdbcDataReader
    Dim stock_id As Integer


    ''''Fonction pour l'affichage pour SessionFormation
    Function SessionFormationReadData() As Boolean

        Try
            CON = New OdbcConnection(database)
            CON.Open()

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            CON.Close()
            End

            Exit Function
        End Try

        CMD = CON.CreateCommand()
        CMD.CommandText = "SELECT * FROM sessionformation;"
        RD = CMD.ExecuteReader()

        DataGridView1.Columns.Clear()
        DataGridView1.Rows.Clear()



        If (RD.Read()) Then

            DataGridView1.ColumnCount = 4

            DataGridView1.Columns(0).Name = "N° de Session"
            'DataGridView1.Columns(0).ValueType = GetType(Integer)

            DataGridView1.Columns(1).Name = "Test"
            'DataGridView1.Columns(1).ValueType = GetType(String)

            DataGridView1.Columns(2).Name = "Date de début"
            'DataGridView1.Columns(2).ValueType = GetType(DateTime)

            DataGridView1.Columns(3).Name = "Date de fin"
            'DataGridView1.Columns(3).ValueType = GetType(DateTime)


            DataGridView1.Rows.Add(RD("id_session"), RD("type"), RD("date_debut"), RD("date_fin"))


            While (RD.Read())

                DataGridView1.Rows.Add(RD("id_session"), RD("type"), RD("date_debut"), RD("date_fin"))


            End While

            'DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Ascending)

            RD.Close()
            CON.Close()
            Return True

        Else

            RD.Close()
            CON.Close()
            Return False

        End If

    End Function


    ''''Fonction pour supprimer une session
    Public Sub SessionFormationDeleteData()

        stock_id = DataGridView1.CurrentRow.Cells(0).Value

        Try
            CON = New OdbcConnection(database)
            CON.Open()
            CMD = CON.CreateCommand()
            CMD.CommandText = "DELETE FROM SessionFormation WHERE ID_session= '" & stock_id & "';"
            CMD.ExecuteNonQuery()
            CON.Close()

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            CON.Close()
        End Try


    End Sub


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Call SessionFormationReadData()


    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ajouter.Show()

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        modifier.Show()

    End Sub


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        Call SessionFormationDeleteData()
        Call SessionFormationReadData()

    End Sub


End Class

现在我想更新第一行,所以我 select 它并单击 "modifier" 按钮。这是顶部的图片=> https://drive.google.com/file/d/0B_Lx61Af8AuUNW45dzFmWHMwcG8/view?usp=sharing

这是 "modifier" 表单的代码:

Imports System.Data.Odbc
Public Class modifier

    Dim database As String = "Driver={PostgreSQL Unicode};Server=localhost;Port=5432;Database=formation;Uid=postgres;Pwd=test;"

    Dim CON As OdbcConnection
    Dim CMD As OdbcCommand


    ''''Affiche les données des cellules de la ligne sélection sur HOME dans les champs respectifs
    Private Sub modifier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TextBox1.Text = accueil.DataGridView1.CurrentRow.Cells(1).Value.ToString()
        DateTimePicker1.Text = accueil.DataGridView1.CurrentRow.Cells(2).Value.ToString()
        DateTimePicker2.Text = accueil.DataGridView1.CurrentRow.Cells(3).Value.ToString()

    End Sub


    ''''Fonction pour mettre à jour la base de donnée suite à une modification
    Public Sub SessionFormationUpdateData()
        Dim stock_id As Integer

        stock_id = accueil.DataGridView1.CurrentRow.Cells(0).Value

        Try
            CON = New OdbcConnection(database)
            CON.Open()
            CMD = CON.CreateCommand()
            CMD.CommandText = "update sessionformation set type= '" + TextBox1.Text.ToString() + "', date_debut='" + DateTimePicker1.Value + "', date_fin='" + DateTimePicker2.Value + "' where id_session= '" & stock_id & "';"
            CMD.ExecuteNonQuery()
            CON.Close()

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            CON.Close()
        End Try


    End Sub


    ''''Bouton "Ok" pour valider les modifications et rafraichir l'affichage sur "HOME"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call SessionFormationUpdateData()

        Close()

        Call accueil.SessionFormationReadData()


    End Sub


    ''''Fermeture de la fenêtre
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Close()

    End Sub

End Class

在 "modifier" 上,当我单击 "ok" 按钮时,"modifier" 窗体关闭,在 "accueil" 窗体上,datagridview 刷新数据库的所有数据.并从第二个 link 从底部开始查看图像上的结果。 ID 为“18”的行移动到数据网格视图的最后一个位置。不知道为什么。

拜托,我需要一些帮助。 感谢阅读我的长文 post 并感谢帮助。 也很抱歉我的英语不好:-)。

这是 postgresql documentation 所述的预期行为:

8.If the ORDER BY clause is specified, the returned rows are sorted in the specified order. If ORDER BY is not given, the rows are returned in whatever order the system finds fastest to produce.

如果您不指定 order by 子句,则服务器可能会在任何 运行 更改顺序('fastest to produce' 后面的评估可能包括系统负载、磁盘访问、天气, 时间, ...).

还要注意这是设计使然(这不是缺陷)或 postgresql 特有的行为,这是许多 RDBMS 的正常和预期行为,因为 relational model.

如果您需要结果集的特定顺序或者您想要该集的可靠顺序,那么您必须使用 order by 子句。