0

問題

そのため、使用するさまざまな設定を含めるために子フォームを使用する親フォームがあります。設定フォームには、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)

ただし、これは複数回実行されます。スレッドが完了すると、トリガーされて別のスレッドが実行されます。おそらくこれが問題の原因ですか?

4

2 に答える 2

0

私は解決策を見つけました。基本的に、スレッドの作成はループ内で行われるため、次のスレッドを実行する前に前のスレッドが完了していることを確認する必要があります。これを行うために、スレッドの最後に起動されるデリゲートを追加しました。これにより、UI スレッドに再度アクセスできるようになります。このソリューションは私にとってはうまくいくので、将来的にも役立つことを願っています.

于 2013-04-05T19:27:27.257 に答える
0

WinForms では、UI 要素 (DataGridView および TextBox コントロールを含む) にアクセスするすべてのコードを同じスレッド (UI スレッド) で実行する必要があります。メイン フォームのコードは間違いなく UI スレッドで実行されSql_settings.Textbox1.text、メイン フォームからアクセスすると、間違いなく UI スレッドのコードにもアクセスします。

これは、無効なデータを取得している理由がクロススレッドの問題に関連していない可能性が高いことを意味します。ただし、オブジェクトのライフサイクルに関連している可能性があります。おそらく、SQL 設定フォームの複数のインスタンスを作成していて、期待するデータを持たないインスタンスの 1 つにアクセスしている可能性があります。

于 2013-04-05T15:02:33.357 に答える