子表单对象引用返回不正确的值

时间:2013-04-05 14:55:00

标签: .net vb.net multithreading parent-child

问题

所以我有一个父表单,它使用子表单来包含要使用的各种设置。设置表单包含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)

然而,这确实会运行多次。一旦线程完成,那么它被触发后再运行另一个线程。也许这导致了这个问题?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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