【问题标题】:VB.Net DataSource for Control Generated at Run Time运行时生成的控件的 VB.Net 数据源
【发布时间】:2013-06-27 11:21:09
【问题描述】:

谁能解释为什么为运行时创建的 ListBox(或其他控件)指定 DataSource 不起作用?

这段代码:

Dim LB As New ListBox
Dim DT As New DataTable

DT.TableName = "Colors"
DT.Columns.Add("color")
DT.Rows.Add("red")
DT.Rows.Add("blue")
DT.Rows.Add("green")

LB.DataSource = DT

Debug.Print(CType(LB.DataSource, DataTable).TableName)
Debug.Print(DT.Rows.Count)
Debug.Print(LB.Items.Count)

产生这个输出:

Colors
3
0

没有产生错误,数据表的名称被拾取,但没有行作为项目添加到列表框中!

【问题讨论】:

  • 这是winforms 还是webforms ListBox。在 ASP.NET 中,设置数据源后需要 DataBind()

标签: vb.net runtime datasource


【解决方案1】:

像这样..

LB.DataSource = DT
LB.DisplayMember = "Color"
Me.Controls.Add(LB)

【讨论】:

  • "Controls.Add" 成功了!我在想这会将列表框添加到我不想要的表单中,因为我正在使用 ToolStripControlHost 来弹出列表框。
  • @oldvbguy .. 如果这有帮助,您应该投票作为答案.. 真正解决了这个问题的 LB.DisplayMember .. Controls.Add 只是我的代码中的附加内容.. :)
  • 关于投票的要点!但是,实际上是 Controls.Add,而不是设置 DisplayMember 才有效。为了简单起见,我从示例中省略了 DisplayMember。如果您运行我的示例代码并添加一个 DisplayMember,您会得到相同的结果。 Controls.Add 解决了这个问题。
【解决方案2】:

在有要显示的内容之前似乎不会读取数据源。只要将控件添加到表单,列表框就会具有数据表中的值。请注意,这可能仍然不是您想要的,因为数据表似乎与 ListBox 不兼容。它将对象返回到字符串数据而不是值。但是,List(Of String) 是兼容的,并且会执行您想要的操作。

【讨论】:

    【解决方案3】:

    Listbox 会排除和显示类对象,尤其是那些覆盖ToString 函数的对象 - 这告诉它要显示什么。它可以保存List(Of myClass) 作为数据源。

    例子:

    Public Class myClass
      Public Property owner As String
      Public Property title As String
      Public Overrides Function ToString() As String
        Return String.Format("{0} - {1}", Me.Owner, Me.title)
      End Function
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2019-02-22
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多