将数据表添加到组合框很慢
Posted
技术标签:
【中文标题】将数据表添加到组合框很慢【英文标题】:Slow to add datatable to comboboxes 【发布时间】:2021-12-24 23:58:59 【问题描述】:我有一个包含五个组合框的表单,每个组合框都添加了相同的数据表,这个数据表是根据从 XML 文件中提取的数据创建的。一切正常,但是,表单需要几秒钟才能加载,并且我已经跟踪代码中最慢的部分是 ComboBox.DataSource = DataTable 的最后一部分。有谁知道为什么需要这么长时间?
Dim GuideDataTable As New DataTable
GuideDataTable.Columns.Add ("Text", GetType (String))
GuideDataTable.Columns.Add ("Index", GetType (Integer))
GuideDataTable.Rows.Add ("", 0)
For ItemIndex = 1 To CountNodes("guidecomponents")
GuideDataTable.Rows.Add(ReadNode("guidecomponents", "name", "index", ItemIndex), ItemIndex)
Next
GuideDataTable.DefaultView.Sort = "Text"
GuideDataTable = GuideDataTable.DefaultView.ToTable
GuideComboBox1.DisplayMember = "Text"
GuideComboBox1.ValueMember = "Index"
GuideComboBox2.DisplayMember = "Text"
GuideComboBox2.ValueMember = "Index"
GuideComboBox3.DisplayMember = "Text"
GuideComboBox3.ValueMember = "Index"
GuideComboBox4.DisplayMember = "Text"
GuideComboBox4.ValueMember = "Index"
GuideComboBox5.DisplayMember = "Text"
GuideComboBox5.ValueMember = "Index"
GuideComboBox1.BindingContext = New BindingContext
GuideComboBox2.BindingContext = New BindingContext
GuideComboBox3.BindingContext = New BindingContext
GuideComboBox4.BindingContext = New BindingContext
GuideComboBox5.BindingContext = New BindingContext
GuideComboBox1.DataSource = GuideDataTable
GuideComboBox2.DataSource = GuideDataTable
GuideComboBox3.DataSource = GuideDataTable
GuideComboBox4.DataSource = GuideDataTable
GuideComboBox5.DataSource = GuideDataTable
【问题讨论】:
数据表大概有多少行? 这里我没有使用BindingContext
。
我并没有低估这里的某些东西...如果您有五 (5) 个组合框,并且所有五 (5) 个组合框都有“相同”DataSource
GuideDataTable
... 那么...所有组合框将“始终”反映“相同选择”值。如果您在 GuideComboBox1
... 中选择第 2 项,那么所有组合框 (1-5) 现在都将第 2 项作为选定项。这适用于任何组合框更改......即所有组合框总是有“相同的选择”项。如果您打算让所有组合框始终包含相同的“选定”值,那么为什么要五个组合框?为什么不是一个组合框?
如果您希望每个组合框包含相同的值但“独立”工作,那么您需要为每个组合框“复制”或“创建”一个新的DataSource
。抱歉,如果我遗漏了什么。
谢谢大家。目前有 29 行从 XML 文件添加到数据表中(它可能会增长,但不会增长太多)。
【参考方案1】:
您应该单步调试代码,看看哪里慢。可能是在数据的检索中,因为设置数据源不是一项艰巨的任务,除非有大量的数据。
如果有很多行,您可以使用异步方法来填充组合框。这将返回 UI 线程,因此不会干扰用户。
你也可以稍微清理一下代码:
GuideComboBox1.BindingContext = New BindingContext
是不必要的。您可以只使用 datasource 属性。
由于有 4 个组合框具有相同的数据和显示值,因此您可以创建一个具有组合框参数的方法。这样你就不必重复你的代码了。以下代码调用表单(或用户控件)中的所有组合框:
For Each box In Me.Controls.OfType(Of ComboBox)
SetDatasource(box, GuideDataTable)
Next
请注意,以上仅调用没有父级的组合框。您需要将Me
替换为父控件(例如面板)
如果您有许多用于不同数据的组合框,您可以通过向需要特定数据源的每个框添加标签并在For
语句中引用它来进一步缩小范围。例如
For Each box In Me.Controls.OfType(Of ComboBox).Where(Function(x) x.Tag = "my tag name")
SetDatasource(box, GuideDataTable)
Next
方法:
Private Sub SetDatasource(box As ComboBox, dataSource As DataTable)
box.ValueMember = "Index"
box.DisplayMember = "Text"
box.DataSource = dataSource
End Sub
【讨论】:
谢谢 Julian,感谢您的 cmets 关于重复的问题,我已按照您的建议修改了我的代码,但很抱歉我不理解您关于使用 DataSource 属性而不是绑定上下文? 我只添加了 29 行(每个 ComboBox 相同),并且通过使用秒表,我将代码的缓慢部分跟踪到最后一部分,其中包含五个 '''GuideComboBox1.DataSource = GuideDataTable'' ' 行。测量时间为 381 毫秒。 这本身不会太糟糕,但我还有另外五个类似的面板,每个面板都有五个 ComboBoxes 从 XML 文件中绘制不同的数据。以上是关于将数据表添加到组合框很慢的主要内容,如果未能解决你的问题,请参考以下文章