1

何らかの理由で、ToolStrip の ProgressBar と Label が他のスレッドから更新されません。たくさん読んだ後、これを思いつきましたが、まだ機能していません(ボタンは問題ありませんが、ステータスバーにはありません)。

    public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e)
    {
        Console.WriteLine(e.Message);

        // error or abort
        if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted"))
        {

            // cross thread crap
            if (pb.GetCurrentParent().InvokeRequired)
                pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; }));

            if (lblStatus.GetCurrentParent().InvokeRequired)
                lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; }));

            btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; }));

            //lblStatus.Text = e.Message;
            //btnImport.Text = "Import";
            //pb.Visible = false;
        }
    }

編集され、すべて機能するようになりましたが、これは BGW スレッドからのコールバックにすぎません。すでに明らかだと思いました。それだけを使用する場合:

        lblStatus.Text = e.Message;  // this is a Label inside Status
        btnImport.Text = "Import";   // this is just a button on Form
        pb.Visible = false;          // this is a Progress Bar inside Status    

クロス スレッド エラーがスローされます。そのため、Invoke() を使用しました。ボタンは更新できますが、ステータス バーのすべてのコントロールは更新できません。

希望は今より明確です。

.NET 3.5、VS2008、Winforms を使用しています。解決策はありますか?

4

1 に答える 1