从父winform更新gui到子winform

时间:2012-10-15 09:51:48

标签: c# winforms user-interface delegates invoke

我正在尝试做什么,当我们点击radform1(Parent)中的按钮时,隐藏radform1然后更新Form1(子窗体)中的text / label / radgrid标题文本值,  一旦我们关闭Form1(子表单)..也关闭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();

        }

1 个答案:

答案 0 :(得分: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();});

通过这种方式,您可以确保该操作将在正确的线程内执行。

希望这有帮助。