我创建了一个简单的例子来说明我发现了什么。我也有一个“修复”,但我认为我不应该需要它!
我正在使用VS2010和.NET 4.我的表单有一个DataGridView(dgvTest)和一个复选框(CheckBox1)。我从表中选择2或3个字段,具体取决于是否选中了复选框(最初是)。
我可能的SQL语句是"SELECT ID,strForenames,strSurname FROM tblAlumni"
和"SELECT strForenames,strSurname FROM tblAlumni"
。
我使用SQL事件探查器确认这些是发送给数据库的查询。
当我加载表单(我看到3个字段,按照我期望的顺序)时,一切似乎都很好,当我取消选中该框时(我按照预期的顺序看到2个字段)。
但是,当我再次检查时,ID字段在DataGridView的列中显示为THIRD,而不是第一个!
我在网上发现了一些类似于这种(错误)行为的报告,但人们似乎只是找到了其他方法来完成这项工作而不是问这是一个需要修复的DataGridView的问题。
由于我已经能够用一个简单的例子重新创建它,我有一些信心(只有一些!),我不会错过任何明显的事情。
Imports System.Data.SqlClient
Imports System.Windows.Forms
Imports System
Public Class Form1
Inherits System.Windows.Forms.Form
Dim sqlConn As SqlConnection
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
loadGRID()
End Sub
Private Sub loadGRID()
Dim sqlConn As SqlConnection = New SqlConnection("Data Source=.\sqlexpress;Initial Catalog=aspnetdb;Integrated Security=True")
sqlConn.Open()
Dim dataAdapter As SqlDataAdapter = New SqlDataAdapter("SELECT " & IIf(CheckBox1.Checked, "ID,", "") & "strForenames,strSurname FROM tblAlumni", sqlConn)
Dim ds As DataSet = New DataSet()
dataAdapter.Fill(ds)
dgvTest.DataSource = ds.Tables(0)
sqlConn.Close()
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
loadGRID()
End Sub
End Class
所以我的问题是,你的专家是否同意这是一个错误? “修复”是在重新填充之间擦除DataGridView,但我不确定我应该这样做吗?
dgvTest.DataSource = Nothing
dgvTest.Refresh()
答案 0 :(得分:0)
我发现BindingSource是'datasource'和datagridview之间的粘合剂,对我来说效果非常好,对不起,我知道不能回答这是否是一个错误,因为我不确定。
(C#)
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = ds.Tables(0);
bindingSource.ResetBindings(false);
答案 1 :(得分:0)
但是,当我再次检查时,ID字段在DataGridView的列中显示为THIRD,而不是第一个!
当strForenames和strSurname列已存在时,这是预期的行为。
在更改数据源之前尝试 dgvTest.Columns.Clear()和 dgvTest.refresh