【问题标题】:VB.Net "mask" combo box text as another textVB.Net“掩码”组合框文本作为另一个文本
【发布时间】:2013-11-22 14:12:04
【问题描述】:

所以我有一个组合框,其中包含来自 MySql 数据库的表名,它们在表单加载时使用show tables 查询自动列出。

是否无论如何要在组合框中显示其他内容,但文本值仍然是原始表名?

【问题讨论】:

  • 是的。很长一段时间没有接触过 WinForms,但我认为组合框有 .Text.Value 属性。如果没有,那么您需要使用Dictionary 或类似的数据结构,并将表名设置为键,将其他内容设置为值。
  • @DouglasBarbin 也许你应该在提出一些不太适用的东西之前做一些快速测试。
  • 您可以将数据库中的所有信息存储到一个临时集合中,您可以在将其设置为组合框数据源之前对其进行编辑;或者您可以通过“随时随地”执行相应的版本来逐一添加组合框项目。默认情况下,ComboBox 项只是简单字符串的集合。
  • @varocarbas 我认为你错过了他想要从数据库中保留原始值的点。
  • @DouglasBarbin 我没有错过任何东西。我已经提出了 OP 想要的传统解决方案。您不能按照您的建议影响 .Text/.Value 属性(ComboBox 项没有此类属性,您可以添加/删除)。

标签: mysql vb.net


【解决方案1】:

这不是不可能的。这是一个简单的例子:

Public Class Form1

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    ' This would be whatever you are pulling from the database.  For the purpose of this example, it is just mock data.
    Dim dataFromDatabase As IEnumerable(Of String) = {"1st table from db", "2nd table from db", "etc."}

    ' What you actually want to display in the combobox.  It should be in the same order as above and have the same number of items.  Items must be unique.
    Dim valuesToDisplayInComboBox As IEnumerable(Of String) = {"1st item", "2nd item", "3rd item"}


    ' This is what ties the two together.  You would probably want this to be larger in scope than this example.
    Dim dataCollection As New Dictionary(Of String, String)   
    For i As Integer = 0 To dataFromDatabase.Count - 1 Step 1
      dataCollection.Add(valuesToDisplayInComboBox(i), dataFromDatabase(i))
    Next

    ComboBox1.DataSource = valuesToDisplayInComboBox

  End Sub
End Class

现在您有一个Dictionary 将这两个链接在一起,因此每当用户在组合框中选择某些内容时,您将转到Dictionary 并查找相应的表名。

【讨论】:

  • 如果“这不是不可能”是对我评论的回答,恐怕这段代码并不能反映我所说的不可能。你能告诉我 .Text/.Value 部分在哪里出现吗?我在您的代码中看到的唯一内容是“over-DataSourcing”,即提供比给定控件可以处理的更多的数据。结果:控件忽略了您提供给它的一半信息。如果您的意图是证明这一点(“当您提供的数量是所需数量的 2 倍时,控件会忽略其中的一半”),那么您是对的。
  • 我说我认为 WinForms 中的组合框可能有.Text/.Value。我还说“如果不是,那么另一种解决方案是……”。由于 Windows 窗体 ComboBox 只能绑定到 1D 数据源,因此有各种解决方法可以实现 OP 试图实现的目标。简单地说它不能完成有点误导。单独使用ComboBox是不行的,但他从来没有说过他只能使用ComboBox。
  • 我从第一个评论开始就提出了这个替代方案(= 从数据库创建一个临时数据源等)。我说的唯一不可能的想法是 .Text/.Value 部分。您实际上说您不确定这部分,但是继续我们讨论的意义何在?我说得非常清楚,唯一不可能的一点是依赖 .Text/.Value。为什么我会说不可能创建 2D 集合??!但是好吧......在我昨天看到/阅读了很多人的文章之后,我开始怀疑这里的诚意/理解......
  • @varocarbas 这只是我们之间的一个简单的误会。不用担心。尽情享受您的一天。
  • (我总是享受每一秒 :))但让我澄清一下您所说的“误解”是什么意思:您说的完全错误 + 声明“很久没有碰过 WinForms”(尽管在winforms中提供建议)+我纠正你的错误=长时间的讨论无处可去。通常我会这样处理这些事情,但昨天我遇到了很多奇怪的人,并答应自己澄清一切,以防万一我和其他人说的是完全不同的语言(这里可能是这种情况)。
【解决方案2】:
Class Element
    Public ItemName as String = ""
    Public ItemData As Object = Nothing     
    ' Object allows it to be reusable beyond this use

    Public Sub New(iName as String, iData As Object)
         ItemName = iName
         ItemData = iData
    End Sub

    Public overrides Function ToString As String
       Return ItemName
    End sub
End Class

....

For each s as string in listoftablesfromdatabase
  ' dont know how you are getting your list, 
  ' but here is one way to alias them
  Dim El as Element

  Select Case s
       Case "tbl_event_birthdays_september"
           El = New Element("September Birthdays", s)
       case ...
       case ...
   End Select
   ComboBox1.Items.Add(el)
 Next s

该类将自动使用您给它的友好名称。获取真正的选中项名称:

  realName = ComboBox1.SelectedItem.ItemData.Tostring

可能不需要 .ToString 这与 Douglas Barbin 的想法没有太大不同,它仍然关联 2 个字符串,只是不使用字典。或者,您可以将元素存储在 List(of Element) 或 Dictionary 中,并将其绑定到数据源,如 Douglas 所示。

如果用户一遍又一遍地回到 Combo,那么一定要使用列表或字典,但不是临时的 - 构建一次并一遍又一遍地使用它。

【讨论】:

  • 请清楚 Douglas 的想法在做什么(因为上面有一些 cmets 可能会被误解):您可以只向 Combobox 提供一维数据源(字符串列表、数组字符串等)。如果你想创建一个 2D 元素并使用它的一个维度来提供组合框,那很好。但是你不能做的是填充两个不同的组合框尺寸,如 Douglas 建议的那样(我说这是不可能的,但他似乎不想承认):你不能为每个项目提供两个不同的属性(.Text/.Value)组合框。
  • 所以...对 OP 的正确回答:有没有办法“掩盖”组合框显示的内容?否(仅依靠组合框)。但是您可以设置一个 2D 数据集,将组合框显示的内容(其数据源)与另一个值列表(组合框甚至不知道)相关联->这就是您的两个答案。
  • @varocarbas 你现在真的在争论语义,试图证明我是不正确的。您的任何回答都对 OP 没有任何帮助。如果您有比已发布的两个更好的解决方案,那么请务必发布您的解决方案。
  • 我对 Douglas 解决方案的唯一参考是将列表或字典绑定到 cbo。 OP 确实没有询问如何使用 "ONLY a cbo" 来掩盖(或别名)某些东西 - 他想隐藏一些名称不佳的表(例如 'tbl_event_birthdays_september')。
  • @DouglasBarbin 我与您的整个讨论开始了,因为您提出了一些不可能的建议:.Text/.Value。为什么一个简单的更正(哎!别这么说)会引发这么长时间的讨论,我仍然不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多