问题
所以我有一个父表单,它使用子表单来包含要使用的各种设置。设置表单包含datagridviews,textboxes,listviews等。父表单称为“MainForm”,设置名称为“SQL_Settings”。每当在父表单中引用子表单中的项目时,我得到的结果都不正确。
例如:
Sql_settings.Datagridview.rows.count
返回值1,但我可以看到其中肯定有多行。
另一个例子:
Sql_settings.Textbox1.text
即使文本中有文字,也会返回空白。
可能的原因?
在尝试使用多线程和委托后,我开始遇到此问题。我曾经使用过这个命令:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
然后删除它决定正确地做它。我想也许这个命令会“遗留下来”?虽然我可能完全错了..
其他信息
Dim data_to_pass(2) As Object
data_to_pass(0) = SQL_Settings.DataGridView1(3, sql_on).Value
data_to_pass(1) = part_information
data_to_pass(2) = ListView8
Dim add_results_thread As New Threading.Thread(AddressOf add_results_to_list)
add_results_thread.IsBackground = True
add_results_thread.Priority = Threading.ThreadPriority.Highest
add_results_thread.Start(data_to_pass)
然而,这确实会运行多次。一旦线程完成,那么它被触发后再运行另一个线程。也许这导致了这个问题?
答案 0 :(得分:0)
在WinForms中,访问UI元素(包括DataGridView和TextBox控件)的所有代码必须在同一个线程(UI线程)上运行。您的主表单代码肯定在UI线程上运行,当您从主表单访问Sql_settings.Textbox1.text
时,您肯定也在UI线程上访问代码。
这意味着您获得无效数据的原因可能与跨线程问题无关。但它可能与您的对象生命周期有关。也许您正在创建SQL设置表单的多个实例,并访问其中一个没有您期望的数据的实例。
答案 1 :(得分:0)
我找到了解决方案。基本上,因为我的线程创建发生在循环中,我必须确保在执行下一个线程之前完成前一个线程。为此,我添加了一个在线程结束时触发的委托,然后允许我再次访问UI线程。这个解决方案对我有用,所以希望它也可以帮助那些未来的人。