【问题标题】:Unable to load data on Select method of Datatable无法在 Datatable 的 Select 方法上加载数据
【发布时间】:2019-12-25 14:31:22
【问题描述】:

尝试根据在 Combobox 中输入的文本将一组数据从数据表填充到 Combobox。但是在数据表的 Select 方法中出现System.Data.DataRow 错误。 以下是在 Form Load 上绑定数据表并在调用 Search 方法时重新绑定数据的代码。

请注意,搜索必须按 Tab 键而不是自动完成

Imports System.Data.SqlClient

Public Class Form1

    Dim connection As SqlConnection = New SqlConnection()
    Dim table As New DataTable

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       LoadComboBox()
End Sub

 Private Sub LoadComboBox()

        Dim adp As SqlDataAdapter = New SqlDataAdapter("select stage from sample", connection)
        adp.Fill(table)
        ComboBox1.DataSource = New BindingSource(table, Nothing)
        ComboBox1.DisplayMember = "stage"

 End Sub

Private Sub Search()
         Dim filteredTable As New DataTable
         Dim filterRow As DataRow()
         Dim str As String = ComboBox1.Text.Trim
         filterRow = table.Select("stage like '%" & ComboBox1.Text.ToString & "%'")
         '**Error in above table(datatable)**       
         For Each rw As DataRow In filterRow
         filteredTable.ImportRow(rw)
         Next

         ComboBox1.DataSource = New BindingSource(filteredTable, Nothing)
         ComboBox1.DisplayMember = "stage"
 End Sub

 Private Sub ComboBox1_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles ComboBox1.PreviewKeyDown
        If e.KeyCode = Keys.Tab Then
            Search()
        End If
End Sub

End Class

【问题讨论】:

  • 看看 AutoCompleteMode 和 AutoCompleteSource 是否能满足您的要求。
  • @Mary 此搜索只能在 Tab 按下时发生,因此我没有使用 AutoCompleteMode 或 AutoCompleteSource。
  • 你在哪里声明了表?
  • @Mary 表在 Form1 类中声明

标签: vb.net datatable


【解决方案1】:

在您绑定到组合框中,您已经有一个数据表,为什么要使用绑定源

为什么不直接说 ComboBox1.DataSource = filtersTable 另外我建议你使用键值对而不是使用 Like 更容易的绑定

就像在 SQL Server 上进行正则表达式搜索一样,这会扼杀你的数据库,并且你正在创造开销

键 |价值 >>
身份证 |名称

所以从另一个堆栈中获取它以便快速参考 gridview bind dropdownlist to List<keyvaluePair<int, string>>

你可以绑定一个dictionary , datatable , dataview 没关系。

如果您想获取文本,只需说出您的 dropdown.text 作为 ID 值 dropdown.value 如果您想稍后在数据库中执行某些操作。

您可以将下拉列表设为只读,并且当用户基本上键入时,他正在输入的内容会根据您绑定的内容进行过滤,这样您就可以进行文本搜索

var dictionary = new Dictionary<int, string>();
dictionary.Add(1, "Home");
dictionary.Add(2, "Work");
dictionary.Add(3, "Mobile");
dictionary.Add(4, "Fax");

dropDown.DataTextField = "Value";
dropDown.DataValueField = "Key";
dropDown.DataSource = dictionary;  //Dictionary<int, string>
dropDown.DataBind();

【讨论】:

  • 您对 BindingSource 是正确的,但是,从使用的对象名称(Form1EventArgs 等)可以看出,这个问题与 Web 开发无关,它是关于一个 WinForms 组合框。 OP 可能不知道 AutoComplete 功能,或者这是为了克服 Autocomplete 限制(仅当输入的文本与 AutocompleteSource 列表中包含的字符串的起始字符匹配时才会触发)。
  • @Jimi 是的,这是一个 WinForm 组合框,搜索只能在 Tab 按下。因此我没有使用 AutoComplete 属性。您能否提出解决此问题的替代方法。
【解决方案2】:

用一点 Linq 试了一下。

Private Sub Search()
    Dim filteredTable As New DataTable
    Dim str As String = ComboBox1.Text.Trim
    Dim filterRows = (From row As DataRow In Table.AsEnumerable
                      Where row.Field(Of String)("Name").Contains(ComboBox1.Text)
                      Select row.Field(Of String)("Name")).ToList
    ComboBox1.DataSource = filterRows
End Sub

只需将您的列名称替换为“名称”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2021-09-20
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多