【问题标题】:Blank DataGridView issue [duplicate]空白 DataGridView 问题 [重复]
【发布时间】:2012-10-27 13:52:59
【问题描述】:

可能重复:
Issue with displaying SQL result in DataGridView

我以前曾问过这个问题,但从未解决过。基本上,我试图用 SQL 查询的结果在我的表单上填充一个 datagridview。我没有从这段代码中得到任何错误,但我只是得到一个完全空白的数据网格视图,即它没有显示任何东西,甚至没有显示列标题。

另外请注意,我知道我目前对我的 sql 上的 SQL 注入持开放态度,我只想在排序之前让它工作。

这是我的全班代码:

Imports System.Data.OleDb
Imports System.Data

Public class TechScreen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0: Data Source = C:\Users\Dave\Documents\jobList.mdb;")
Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM jobList WHERE techID = " &  TechScreenID &"", con)
con.Open()
Dim DA As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim mydataset As DataSet = New DataSet
DA.Fill(mydataset, "MyTable")
DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView
con.Close()
con = Nothing

End sub
End class

【问题讨论】:

    标签: .net sql vb.net datagridview


    【解决方案1】:

    首先,虽然它可能是也可能不是问题的根源,但这条线:

    DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView
    

    包含一个错字。应该是 DataGridView1.DataSource。似乎这会导致编译器错误。

    除此之外,请尝试简化类似于下面的内容,如果您仍然遇到绑定问题,请在调试器中逐步检查以确保一切都按预期工作。此外,检查 dgv 控件上的“自动生成列”属性是否设置为 true。

    我不清楚您要做什么,因此以下是一个非常笼统的示例,说明了我将如何处理此问题。

    • 首先,将连接字符串移动到项目设置文件中, 并使用 My.Settings.MyConnectionStringName 来引用它。
    • 其次,在 SQL 中使用参数,而不是内联。
    • 将您的数据访问内容包装在“使用”块中。使用将处理 为您处理块范围内的对象,通常是 更清洁的方式。
    • 只是我个人的喜好,但我不喜欢所有的 bs 开销 带有数据集,一个简单的数据表就可以了。
    • 我没有在这里尽可能充分地做到这一点,但我推荐 将数据检索与分配给 UI 控件分开。甚至 更多,我可能会进行下一步,将控件分开 来自 Form Load 事件的赋值也是如此。你可能会发现 您的表单中有多个地方需要数据源 刷新或重置。

    有多种方法可以解决这个问题,我的不一定是“流行的方式。但是,下面的方法刚刚对我有用。

    简化您的代码,并进行一些重构:

    Imports System.Data
    Imports System.Data.OleDb
    
    Public Class TechScreen
    
        Private Sub TechScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            'Not sure where your TechScreenID input parameter is coming from, so this is just for example:
            Dim TechID As Integer = 1
    
            ' Use a function to return the data to be used as the DataSource for the dgv control:
            DataGridView1.DataSource = Me.JobListTable(TechID)
    
        End Sub
    
    
        Private Function JobListTable(TechID As Integer) As DataTable
            Dim dt As DataTable = Nothing
    
            Dim SQL As String = "SELECT * FROM joblist WHERE techID = @TechID"
    
            ' The Using block handles disposal of objects initialized:
            Using con As OleDbConnection = New OleDbConnection(My.Settings.MyConnection)
                Using cmd As OleDbCommand = New OleDbCommand(SQL, con)
    
                    ' Use parameters instead of inline concatenation for cleaner code,
                    ' and protection against sql injection attacks:
                    cmd.Parameters.AddWithValue("@TechID", TechID)
                    con.Open()
    
                    dt = New DataTable()
    
                    Try
                        dt.Load(cmd.ExecuteReader())
                    Catch
                        MsgBox("There was an error retrieving data")
                    Finally
                        con.Close()
                    End Try
                End Using
            End Using
    
            Return dt
    
        End Function
    
    End Class
    

    【讨论】:

    • 对它进行了排序,这是我如何在 sql 字符串中声明我的 TechID 的问题。感谢所有回复
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多