【问题标题】:DataTable Column to String Array in Vb.NetVb.Net中的DataTable列到字符串数组
【发布时间】:2014-10-22 07:24:02
【问题描述】:

我正在使用 DataTable Column,我想将数据表的单列提取到 String 数组,然后想分配给 AutoCompleteStringCollection 对象。目前我正在使用循环填充“AutoCompleteStringCollection”,但如果我有超过 500 行,则需要时间。我想用外循环来做到这一点。任何机构都可以提出更好更快的方法。

Dim autocomp As New AutoCompleteStringCollection
        For index As Integer = 0 To unionTable.Rows.Count - 1
            autocomp.Add(unionTable.Rows(index)(1).ToString())
        Next

我想不用循环,请帮忙

经过一番挣扎,我设法做到了这一点。使用 .Net 3.5 框架

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
        Dim table1 As DataTable = New DataTable("Test")
        table1.Columns.Add("name")
        table1.Columns.Add("id")
        table1.Rows.Add("Abb", 1)
        table1.Rows.Add("Killers", 2)

        Dim allAutoCompletes = From row In table1.AsEnumerable()
                       Let autoComplete = row.Field(Of String)(0)
                       Select autoComplete
        Dim autoCompleteString As String() = allAutoCompletes.ToArray()
        Dim x As String = ""
        Dim autocomp As New AutoCompleteStringCollection
        autocomp.AddRange(autoCompleteString)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

【问题讨论】:

    标签: vb.net autocomplete datatable


    【解决方案1】:

    您总是必须使用循环。但是你可以使用看起来更好的 LINQ:

    Dim allAutoCompletes = From row In unionTable.AsEnumerable()
                           Let autoComplete = row.Field(Of String)(1)
                           Select autoComplete 
    Dim autoCompleteStringCollection As String() = allAutoCompletes.ToArray()
    

    如果您想要List(Of String),请使用ToList

    这里的方法语法与上面相同,使用你觉得更易读的:

    Dim autoCompleteStringCollection As String() = unionTable.AsEnumerable().
        Select(Function(r) r.Field(Of String)(1)).
        ToArray()
    

    【讨论】:

    • 但是这个错误:'AsEnumerable'不是'System.Data.DataTable'的成员
    • 您必须使用 >= .NET 3.5 并添加 Imports System.Linq。您还必须在项目中添加对System.Data.DataSetExtensions 的引用,应该没问题。
    • 那么您是否添加了对System.Data.DataSetExtensions dll 的引用?
    • 不,我不能,因为如果要添加此引用,我必须更改其他内容。
    • @DareDevil:我不明白你还有什么需要改变的。但是,我认为您可以使用unionTable.Rows.Cast(Of DataRow)() 而不是AsEnumerable
    【解决方案2】:

    Rango 的代码非常适合我。这是作为扩展的代码,可以放置在任何公共模块中,并通过在您希望启用它的类中添加“Imports Extensions”来使用:

    Public Module Extensions
        ''' <summary>Build string array from specified column in DataTable.</summary>
        ''' <returns>String()</returns>
        <Extension()>
        Public Function ColumnToStringArray(ByVal dataTable As DataTable, columnIndex As Integer) As String()
            Dim allAutoCompletes = From row In dataTable.AsEnumerable()
                               Let autoComplete = row.Field(Of String)(columnIndex)
                               Select autoComplete
            Return allAutoCompletes.ToArray()
        End Function
    End Module
    

    用途:

    Dim dt as DataTable = (function that returns datatable)
    TextBox1.AutoCompleteCustomSource.AddRange(dt.ColumnToStringArray(0))
    

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多