0

问题

所以我有一个父表单,它使用子表单来包含要使用的各种设置。设置表单包含数据网格视图、文本框、列表视图等。父表单称为“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)

但是,这确实运行了多次。一旦线程完成,它就会被触发以运行另一个线程。也许这是导致问题的原因?

4

2 回答 2

0

在 WinForms 中,所有访问 UI 元素(包括 DataGridView 和 TextBox 控件)的代码都必须在同一个线程(UI 线程)上运行。您的主窗体代码肯定在 UI 线程上运行,当您Sql_settings.Textbox1.text从主窗体访问时,您肯定也在访问 UI 线程上的代码。

这意味着您获得无效数据的原因可能与跨线程问题无关。但这可能与您的对象生命周期有关。也许您正在创建 SQL 设置表单的多个实例并访问其中一个没有您期望的数据的实例。

于 2013-04-05T15:02:33.357 回答
0

我找到了解决方案。基本上,由于我的线程创建是在循环中发生的,因此我必须确保前一个线程在执行下一个线程之前完成。为此,我添加了一个在线程末尾触发的委托,然后允许我再次访问 UI 线程。这个解决方案对我有用,所以希望它对未来的人也有帮助。

于 2013-04-05T19:27:27.257 回答