【问题标题】:Combobox - display 2 Datatable columns组合框 - 显示 2 个数据表列
【发布时间】:2016-08-12 08:44:43
【问题描述】:

我为 DataTable 中的组合框创建了多列下拉列表,现在我也想在其中显示两列。到目前为止,仅显示 1 列(带有 DisplayMember 属性)。所以基本上我想要自动完成,两列都显示在组合框中。 I would be satisfied with displaying 2nd column in Textbox next to combobox too, but It must work as Autocomplete (when selected index changes, display value changes too).我需要这个,因为两个 Datable 值(姓名和姓氏)将一起添加到另一个数据库表中,并且用户可以在同一个位置查看这两个值。

已编辑:

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

            Dim SQL As String = "SELECT ID,Name ||' ' || Surname as FullName from MyTable"

            Dim dtb As New DataTable()
            dtb.Columns.Add("Name", System.Type.GetType("System.String"))
            dtb.Columns.Add("Surname", System.Type.GetType("System.String"))

            Using con As OracleConnection = New OracleConnection("Data Source=MyDB;User Id=Lucky;Password=MyPassword;")

                Try

                    con.Open()

                    Using dad As New OracleDataAdapter(SQL, con)
                        dad.Fill(dtb)

                    End Using

                    Combobox1.DataSource = dtb
                    Combobox1.DisplayMember = "FullName"
                    Combobox1.ValueMember= "ID"
                    con.Close()

                Catch ex As Exception
                    'MessageBox.Show(ex.Message)
                Finally
                    con.Dispose()
                End Try

            End Using

        End Sub

并在组合框列之间画线:

 Private Sub Combobox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles Combobox1.DrawItem

        e.DrawBackground()

        Dim drv As DataRowView = CType(Combobox1.Items(e.Index), DataRowView)

        Dim id As String = drv("Name").ToString()
        Dim name As String = drv("Surname").ToString()

        Dim r1 As Rectangle = e.Bounds
        r1.Width = r1.Width / 2


        Using sb As SolidBrush = New SolidBrush(e.ForeColor)
            e.Graphics.DrawString(id, e.Font, sb, r1)
        End Using


        Using p As Pen = New Pen(Color.AliceBlue)
            e.Graphics.DrawLine(p, r1.Right, 0, r1.Right, r1.Bottom)
        End Using


        Dim r2 As Rectangle = e.Bounds
        r2.X = e.Bounds.Width / 2
        r2.Width = r2.Width / 2

       Using sb As SolidBrush = New SolidBrush(e.ForeColor)
            e.Graphics.DrawString(name, e.Font, sb, r2)
        End Using

    End Sub

有什么建议吗?提前致谢!!

【问题讨论】:

  • 我没用过,但昨天看到有人提到过codeproject.com/Articles/8619/…
  • 我已经测试过了,它不能正常工作。除此之外,我的解决方案在这里运行良好,我只想为两列自动完成。我之前的帖子:stackoverflow.com/questions/38868261/…
  • 哈哈,是的,是你发的。您是否尝试过查看他们如何尝试在他们的库中进行自动完成?
  • 不,我没看过。我只是想为我的表单找到某种解决方案 - 用户需要输入已经在不同表中的姓名和姓氏(所以只需选择它们,然后用它自动填充字段或组合框),并将它们一起保存在不同的表中字段为字符串。
  • 对我来说听起来不像是自动完成。所有正常的自动完成功能都是为您的数据源中匹配的内容提出建议,如果您点击选项卡,那么该建议将成为组合框的选定项。如果我提到的是你所追求的,你可以试试:stackoverflow.com/questions/11780558/…。它可能会给你一些东西。

标签: vb.net combobox datatable


【解决方案1】:

查看此答案:https://stackoverflow.com/a/5570901/6550457

它暗示:

 comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
 comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;

【讨论】:

  • 首先,我是VB.NET初学者。此自动完成功能确实有效,但我将其更改为 .Suggest only。其次,这解决了一半的问题 - 组合框(名称)中仍然只显示 1 列。如何在组合框中显示两列,例如“John Davies”?
  • 你需要2列吗?如果您想要的是某人的全名,那么不要查询SELECT Name,Surname from MyTable,只需加入他们SELECT Name + ' ' + Surname from MyTable。除此之外,我不确定你会怎么做。
  • 这让我们回到了起点。好的,告诉我这个......你会怎么做......我在 DB 中有 1 个表,其中有很多字段可以输入数据。在同一张表中,我需要在字段中输入 4 个不同的员工作为字符串(技术人员、用户、开发人员和维护人员)以及姓名和姓氏。现在我想开发用户友好的表单,您可以在其中输入所有这些姓名和姓氏 - 但这些姓名和姓氏应该从组合框/数据网格/列表视图等中选择,因为它们已经在不同的表格中。你会怎么做?
  • 首先,您的记录是如何键入的?你有一个 EmployeeId 字段。或者您是否打算使用 FirstName、SurName 作为键。我会查询 id + fullname。我会使用全名进行自动完成,将 DisplayMember 设置为全名,将值成员设置为 id。然后,当我需要访问另一个表时,我会使用该 ID。如果您有其他选择,复合键是一个糟糕的选择。
  • 员工表:(ID、姓名、姓氏)...我的表:(ID、技术人员、用户、开发人员;维护者、、、和所有其他字段)...我的首选输出我的表字段将是姓名和姓氏一起作为字符串,因为那时我不会在任何查询中使用它。但是我也可以使用表Employee作为链接表,但是我不知道如何在VB.NET中做它,一直在搜索。我只在 Access 中这样做过,但那里的事情非常简单。
【解决方案2】:

实现这一切的唯一方法是添加另一个组合框并将他绑定到同一个数据表。这样,当您从组合框中选择项目时,您会看到其中的两个值。自动完成也可以。在同一个组合框中做所有事情不好,显示的文字太宽,看起来不好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2022-08-15
    • 2021-08-16
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多