我的表格上有很多组合框(大约20个),所有这些组合都显示来自我的数据库的不同表格中的项目。如果我将所有代码放在Form_Load事件上,那么Form打开速度非常慢。所以我尝试粘贴不同种类的代码,目前我停留在Combobox_Enter事件 - 现在Form加载速度很快,但是当我点击组合框的下拉时,我看到有时“System.Data.DataRowView”在加载项目之前闪烁在Combobox中。有没有办法实现两者 - 快速打开和打开Combobox加载项目没有闪烁?....到目前为止,我测试了Form_Activate,Form_GotFocus(不工作)和Combobox_GotFocus,Combobox_MouseHover,Combobox_Click(不完全完美)。这是我如何绑定我的Comboboxes的一个例子:
Private Sub Combobox1_Enter(sender As Object, e As EventArgs) Handles Combobox1.Enter
Dim SQL As String = "SELECT Name from MyTable"
Dim dtb As New DataTable()
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 = "Name"
con.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Dispose()
End Try
Combobox1.SelectedIndex = -1
End Using
End Sub
我也尝试声明“Public con As OracleConnection”,但输出与我现在的相同。
任何有用的帮助!
答案 0 :(得分:1)
绑定ComboBox
之类的时候,你应该总是最后设置DataSource
。你不是,那就是为什么你看到" System.Data.DataRowView"显示。
当您将列表绑定到ComboBox
时,控件将显示DisplayMember
中指定的列或属性中的数据(如果有),否则将在每个上调用ToString
项目。在您的代码中,您首先设置DataSource
,此时,DisplayMember
未设置,因此控件会在每个项目上调用ToString
。结果是" System.Data.DataRowView"。然后,当您设置DisplayMember
时,控件刚刚遇到生成和显示问题的那些值将被丢弃,DisplayMember
用于获取新值。
即使你没有看到这种效果,你仍然在浪费你的控制时间来产生你不想要的价值。除非您有特殊原因,否则请始终在代码中设置DisplayMember
之前设置ValueMember
,DataSource
等。我清楚知道的唯一原因是当您绑定CheckedListBox
时,DataSource
最后设置时会出现问题。
顺便说一句,如果没有已经加载的数据,那么您是否应该只在那里进行测试?如果用户返回相同的控件,您不想重新加载数据,是吗?