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
子句。
我使用 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
子句。