0

私がやろうとしていることは、radform1(親)のボタンをクリックすると、radform1を非表示にし、Form1(子フォーム)を閉じたら、Form1(子フォーム)のtext / label/radgridヘッダーテキスト値を更新します。 radform1(Parent)も閉じます。

エラーメッセージが表示されます:Invalid OPeration Exception was Un-Handledクロススレッド操作が無効ですコントロール'radPageView1は、作成されたスレッド以外のスレッドからアクセスされました。

この問題を修正するには、invokeまたはactionメソッドをどのように使用できますか?コンセプトがよくわかりませんでした。ここで何をしたらいいのか説明してください...助けていただければ幸いです!

Form1 frm = new Form1();
        private void radButton1_Click(object sender, EventArgs e) // French Version Button
        {
            timer1.Enabled = true;
            radProgressBar1.Visible = true;
            frm.radGridView1.Columns[0].HeaderText = "Test"; // Change the Radgrid Header Text at Col[0]

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            ticks++;
            radProgressBar1.Value1 = ticks;
            if (ticks != 100) return;
            timer1.Enabled = false;
            ticks = 0;

            frm.FormClosed += (_, args) => frm.Close();
            frm.Hide();
            frm.Show();

        }
4

1 に答える 1

1

よく理解しているかどうかはわかりませんが、次のようなものが必要だと思います。

public static void InvokeIfRequired(this Form c, Action<Form> action)
        {
            if (c.InvokeRequired)
            {
                try { c.Invoke(new Action(() => action(c))); }
                catch { }
            }
            else
            {
                action(c);
            }
        }

と電話

frm.InvokeIfRequired((_)=>{frm.ChangeSomethingInTheUI();});

このようにして、アクションが正しいスレッド内で実行されることが確実になります。

お役に立てれば。

于 2012-11-14T12:42:27.297 に答える