【问题标题】:How to Populate a DataTable in a DataGridView如何在 DataGridView 中填充 DataTable
【发布时间】:2020-06-06 14:23:37
【问题描述】:

我创建了一个 WCF Web 服务,它在单击按钮时将一个简单的 DataTable 返回到一个 Windows 窗体。 我在 DataGridView 中显示返回的数据时遇到问题。

这是使用VB的Web服务中的代码

    Public Function GetEmployees() As EmployeesData Implements IService1.GetEmployees

            Dim str As New String("Provider=Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|XXX.accdb;User Id=XXX;Password=XXX")
            Dim conn As New OleDbConnection(str)
            Dim cmd As New OleDbCommand("SELECT * FROM employees", conn)
            conn.Open()

            Dim sda = New OleDbDataAdapter

            cmd.Connection = conn
            sda.SelectCommand = cmd

            Using dt As New DataTable()
                Dim employees As New EmployeesData()
                sda.Fill(employees.EmployeesTable)
                Return employees
                conn.Close()
            End Using
        End Function
<DataContract()>
Public Class EmployeesData

    Public Sub New()
        EmployeesTable = New DataTable("EmployeesData")
    End Sub

    <DataMember()>
    Public Property EmployeesTable() As DataTable

End Class

这是在 Windows 窗体中单击按钮结束

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

            Dim client As Service1Client = New Service1Client()

            DataGridView1.DataSource = client.GetEmployees()
            DataGridView1.AutoGenerateColumns = True

        End Sub

现在,当我单击按钮时,它不会将数据填充到网格中。

【问题讨论】:

  • 在设置DataSource 后将AutoGenerateColumns 设置为True 并没有什么意义。默认情况下它已经是True,因此设置它的唯一原因是如果您不想在设置DataSource 时自动生成列,在这种情况下您可以将其设置为False
  • 您不需要打开/关闭连接;数据适配器知道如何自行完成。此外,在 return 语句之后关闭并没有什么意义......

标签: vb.net winforms data-binding datagridview


【解决方案1】:

大概是这样的:

DataGridView1.DataSource = client.GetEmployees()

应该是这样的:

DataGridView1.DataSource = client.GetEmployees().EmployeesTable

【讨论】:

    【解决方案2】:

    您的服务器代码应该看起来更像:

        Public Function GetEmployees() As EmployeesData Implements IEmployeesService.GetEmployees
    
            Dim con As New String("Provider=Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|XXX.accdb;User Id=XXX;Password=XXX")
            Dim cmd = "SELECT * FROM employees"
    
            Using sda As New OleDbDataAdapter(cmd, con)
              Dim employees As New EmployeesData()
              sda.Fill(employees.EmployeesTable)
            End Using
        End Function
    

    还有你的客户端代码:

        Private Sub LoadEmployeesButton_Click(sender As Object, e As EventArgs) Handles LoadEmployeesButton.Click
    
            Dim client = New EmployeesServiceClient()
    
            EmployeesDataGridView.DataSource = client.GetEmployees().Employees 
    
        End Sub
    
    • 只需给 dataadaper 一个命令字符串和一个连接字符串 - 它知道如何自己做其他所有事情,因此无需用它来弄乱您的代码
    • 停止保留所有内容的默认名称 - 如果保留默认名称,您最终会遇到 Button27、Label54、TextBox38 的混乱混乱。重命名这些东西需要几秒钟

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多