zw_7627 发表于 2020-8-10 23:52:47

C#如何在父窗体改变子窗体的控件?

我使用委托,在父窗体中定义From2 form2 = new Form2();
this.Invoke((EventHandler)(delegate
{
       this.form2.btnMode.Text = "显示";
}));
编译不报错,但Form2里面的控件按钮没改变,是怎么回事?
                                                         

Error.Dan 发表于 2020-8-11 08:48:32

思路没问题,应该是姿势问题,而且你这个在主窗体中起invoke感觉不太对。。。
直接脏代码给form2 起公开方法不好吗?不要纠结,解决问题先

pursuits 发表于 2020-8-11 09:40:45

我试了下,是可以的。
你的form2。show()是在设置之后吗?

way2888 发表于 2020-8-11 12:54:42

跨窗体操作最后使用对象指针

yuyu87 发表于 2020-8-11 13:28:50

FORM2先定义成全局静态的再试一下

zw_7627 发表于 2020-8-11 22:18:12

Error.Dan 发表于 2020-8-11 08:48
思路没问题,应该是姿势问题,而且你这个在主窗体中起invoke感觉不太对。。。
直接脏代码给form2 起公开方 ...

委托是在主窗体的线程中,直接Form2 .btnMode.text ="显示”;会报Error        1        'test.debug.btnMode' is inaccessible due to its protection level       

zw_7627 发表于 2020-8-11 22:40:23

结贴。把按钮btnMode 属性modifiers设为 public 即可。

zw_7627 发表于 2020-8-11 23:58:08

yuyu87 发表于 2020-8-11 13:28
FORM2先定义成全局静态的再试一下

出新问题了。在主窗体声明全局后,Form2 form2 = new Form2 ();先打开form2没问题,但是在先打开第三个窗体,然后再打开第二个窗体时,系统死机。报An unhandled exception of type 'System.ObjectDisposedException' occurred in System.Windows.Forms.dll

Additional information: 无法访问已释放的对象。
系统停在form2.show();

智涅 发表于 2020-8-12 00:07:24

父子窗体不是有Mdiparent的吗?
public Form2()
{
        InitializeComponent();
        this.IsMdiContainer = true;
}

private void calcToolStripMenuItem_Click(object sender, EventArgs e)
{
        foreach (Form fo in this.MdiChildren)
        {
                if (fo.Name == "f1")
                {
                        fo.Activate();
                        return;
                }
        }
        Form1 f1 = new Form1();
        f1.MdiParent = this;
        f1.Name = "f1";
        f1.Show();
}

//Form2是父,Form1是子
页: [1]
查看完整版本: C#如何在父窗体改变子窗体的控件?