组合框无法绑定

时间:2016-10-21 13:20:05

标签: .net vb.net stored-procedures data-binding combobox

我有这个代码,我正在做的是执行StoredProcedure,它只选择2个字段(ID,Name),然后我想用数据填充组合框。这是我的代码......

   Using con As New SqlConnection(sConnection)
        Dim cmd As New SqlCommand
        Dim ds As New DataSet
        Dim sqlAdp As New SqlDataAdapter
        con.Open()

        cmd.CommandText = "sp_RData"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@Name", "Accounting")
        cmd.Connection = con
        sqlAdp.SelectCommand = cmd
        sqlAdp.Fill(ds)

        ComboBox1.DataSource = ds
        ComboBox1.ValueMember = "ID"
        ComboBox1.DisplayMember = "Name"
    End Using

我的存储过程非常简单,就像这样......

Select ID, Name from tblRData where Name = @Name 

@Name显然是我试图传递的参数。

在Combobox1.ValueMember =“ID”上发生了什么,它说“无法绑定到新的显示成员。”

任何人都知道为什么?这是使用存储过程中的数据填充组合框的最佳方法吗?想知道这是不是防弹,我不认为不是,因为很多组合框将填充在form_load上,只是想知道是否有更好的方法来做到这一点。从VB6的精彩世界进入vb.net。

1 个答案:

答案 0 :(得分:2)

代码中唯一真正“错误”的是:

ComboBox1.DataSource = ds

与名称相反,DataSet不包含数据,而是数据所在的DataTable个对象的集合,因此:

ComboBox1.DataSource = ds.Tables(0)

但代码可以更短,效率更高:

Using con As New SqlConnection(sConnection),
     cmd As New SqlCommand("sp_RData")

    cmd.CommandType = CommandType.StoredProcedure
    con.Open()

    cmd.Parameters.Add("@Name", SqlDbType.Text).Value = "Accounting"

    Dim dt As New DataTable()
    dt.Load(cmd.ExecuteReader())

    ComboBox1.DataSource = dt
    ComboBox1.ValueMember = "ID"
    ComboBox1.DisplayMember = "Name"
End Using
  • DataAdapters,DBCommand对象以及其他一些对象应在使用后处理。通常,应在Dispose()块中使用实现Using方法的任何内容。上面的代码将Connection和Command对象“堆叠”到一个Using块中,主要是为了减少缩进。
  • DataAdapter非常强大。它可以存储连接以及从单个基表中添加,插入,更新和删除的所有SQL。由于可以使用DataTable对象填充DbCommand,因此它更简单,并且使用更少的“事情”来完成工作。对于某些提供程序和非常大的数据集,适配器更快,但数量不足以担心。
  • 使用参数时,首选AddAddWithValue。后者要求DB Provider根据传递的数据推断数据类型,这在某些情况下可能会失败。

上面的代码填充了本地DataTable,然后超出了范围。这可能没问题,但考虑到WHERE子句可能没有。如果您稍后(重新)用“Janitorial”中的名字填充CBO,则有一种更简单的方法:

  • 声明表单/类级别DataTable,以便您可以在别处引用它
  • 删除WHERE子句并用所有名称填充(例如“SELECT Id,Name FROM Departments”)。

根据需要更改过滤器:

dtDepts.DefaultView.RowFilter = String.Format("Name = '{0}", thisDept)

视图根据您的需要限制显示为“管理”或“秘书”的内容。绑定到表的CBO会自动更新。