【问题标题】:generic function/sub to fill a vb.net combobox from a module用于从模块填充 vb.net 组合框的通用函数/子
【发布时间】:2013-12-07 00:40:25
【问题描述】:

尝试使用 vb.net 2010 中的模块中的通用例程填充组合框。我将变量 formname.comboboxname 传递给子并将其拆分为 2,运行查询,这是我不能去的地方更远。我需要这样做,因为我有很多表格和组合框要填写,我认为一个模块中的通用方法会很棒。

我可能会分解并为每个组合框做一个数据集,但这当然应该有效,并且是我的首选。

在表单代码中,我用 --- loadComboBoxOrHelp("FrmArchive.cmbSrcType") 调用它,这是在我的模块中,一些代码被注释只是为了显示我到目前为止所做的尝试。当然,如果我取消注释 CTYPE 上面的行,但它不是通用的。正如您可以从函数的名称中猜到的那样,我想填充一个组合框或一个帮助文本字段,但我还没有完成该代码,我假设一旦组合框部分工作,我就可以猜出文本框部分。查询将是相同的,只是一个文本框而不是组合框。

CTYPE 是我的错误,我试图从一个模块中执行此操作,所以它非常通用,如果我将它放在表单代码中,它当然可以工作。 ** 我删除了 SQL,因为它使问题变得混乱。我现在用 loadComboBoxOrHelp(Me, cmbSrcType) 来调用它

Public Sub loadComboBoxOrHelp(ByVal formName, ByVal boxName)
    Try
        CType(formName.Controls(boxName), ComboBox).Items.Add("ABC") 'myReader.GetString("lookupValue").ToString)
    Catch ex As Exception
        MessageBox.Show("Error while retrieving records on table Lookups..." & ex.Message, "Lookups Table")
    Finally
        If conn.State = ConnectionState.Open Then conn.Close()
    End Try
End Sub

结束模块

【问题讨论】:

  • 为什么不直接传递组合框控件而不是嵌入名称的字符串?

标签: .net vb.net generics combobox


【解决方案1】:

好吧,我认为你可以直接将 ComboBox 传递给函数,但如果你真的想使用字符串,那么你需要找到一种方法来从传入的名称中检索 Form 和组合实例

Public Sub loadComboBoxOrHelp(ByVal boxName)
    Dim words = boxName.Split(".") 
    Dim formName = Application.OpenForms(words(0))  
    Dim cmbBox = formName.Controls(words(1))
    ......

作为旁注。使用参数化查询来构建 sql 命令,而不是字符串连接。此外,如果您完全控制传递给 sql 命令的内容,最好避免引用/取消引用值

    conn.Open()
    myCommand.Connection = conn
    Dim query = "SELECT name, lookupValue " _
                & "FROM lookups " _
                & "WHERE name = @bxname"
    myCommand.CommandText = query
    myCommand.Parameters.AddWithValue("@bxname", boxName)
    myReader = myCommand.ExecuteReader()

【讨论】:

  • 我发誓我尝试分别传递表单和组合名称,但它不起作用,但它现在可以工作,所以谢谢。但是,我无法让您的代码按原样工作,它不会给出错误,但也不会输入值。由于数据库的构建方式,如果我可以传入一个值会更容易,但我会对您的代码进行更多实验,我更喜欢拆分值。我没有对 SQL 进行参数化,因为在这种情况下,只有 4 个经理有权更改查找值,所以我不关心 sql 注入,但我认为你的观点更容易,并且无论如何都会这样做。
  • 好的,我说得太早了,还是不行。从家里我让它工作,但只在一个非常小的测试应用程序上。在我标记为已解决时我无法访问的真正应用程序仍然无法工作,我放弃了。它可以像史蒂夫编码的那样工作,但我的应用程序有很多表格,但出于某种原因,它不是。作为记录,我将 sub 更改为一个函数并返回一个包含数据的数组并以这种方式加载它,虽然通用性稍差一些,但它可以工作。
  • 这一行,Dim cmbBox = formName.Controls(words(1)),正是我在这种情况下所需要的。我已经将表单名称作为全局名称,只需要知道如何处理组合框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2015-03-23
  • 2015-07-13
相关资源
最近更新 更多