У меня есть простой пример, иллюстрирующий то, что я нашел.У меня также есть «исправление», но я не думаю, что оно мне нужно!
Я использую VS2010 и .NET 4. В моей форме есть DataGridView (dgvTest) и флажок (CheckBox1).Я выбираю 2 или 3 поля из таблицы, в зависимости от того, установлен ли флажок (который изначально).
Мои возможные операторы SQL: "SELECT ID,strForenames,strSurname FROM tblAlumni"
и "SELECT strForenames,strSurname FROM tblAlumni"
.
Я использовал SQL Profiler для подтверждения того, что это запросы, отправленные в БД.
Все выглядит хорошо, когда я загружаю форму (я вижу 3 поля в том порядке, в котором я ожидаю) и когда снимаю флажок (я вижу 2 поля в том порядке, в котором я ожидаю).
Однако, когда я проверяю его снова, поле ID появляется в столбцах ТРЕТЬЕГО, а не в столбцах идентификатора.
Я нашел пару сообщений о чем-то похожем на это (неправильное) поведение в сети, но люди, похоже, просто находят какой-то другой способ выполнить работу, а не спрашивают, является ли это проблемой с 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()