将数据表添加到组合框很慢

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) 个组合框都有“相同”DataSourceGuideDataTable... 那么...所有组合框将“始终”反映“相同选择”值。如果您在 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 文件中绘制不同的数据。

以上是关于将数据表添加到组合框很慢的主要内容,如果未能解决你的问题,请参考以下文章

在win10访问samba弹出访问框很慢怎么解决

将大量数据绑定到组合框?

将组合框添加到链接到数据表的数据网格

将数据添加到已存在组合框列的 dataGridView 行

如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)

vc++6.0如何实现在模态对话框编辑框中输入数据,单击确定按钮将数据添加到组合框按钮中!