父窗体如何改变子窗体控件?

weixin_42107206 2020-08-10 11:55:54
我使用委托,在父窗体中定义From2 form2 = new Form2();
this.Invoke((EventHandler)(delegate
{
this.form2.btnMode.Text = "显示";
}));
编译不报错,但Form2里面的控件按钮没改变,是怎么回事?
...全文
3172 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
datafansbj 2020-08-14
  • 打赏
  • 举报
回复
引用 12 楼 weixin_42107206 的回复:
[quote=引用 3 楼 wilson1966 的回复:]不用委托,在子窗体(form2) 把按钮btnMode 属性modifiers设为 public 即可供母窗体Call

From2 form2 = new Form2();
form2.btnMode.Text = "显示";



定义全局From2 form2 = new Form2();

private void ToolStripMenuItem_Click(object sender, EventArgs e)
{

form2.show();
}
在父窗体中form2.textbox1.text= "show";子窗体有显示。但是关闭子窗体后,就打开不了了。[/quote]

子窗体关闭后,当然打不开了,因为子窗体已经 Close,不再可用,除非重新 new 一个新的子窗体。如果要求“关闭”后还可用,应设置 visible = false。
weixin_42107206 2020-08-12
  • 打赏
  • 举报
回复
引用 3 楼 wilson1966 的回复:
不用委托,在子窗体(form2) 把按钮btnMode 属性modifiers设为 public 即可供母窗体Call

From2 form2 = new Form2();
form2.btnMode.Text = "显示";



定义全局From2 form2 = new Form2();

private void ToolStripMenuItem_Click(object sender, EventArgs e)
{

form2.show();
}
在父窗体中form2.textbox1.text= "show";子窗体有显示。但是关闭子窗体后,就打开不了了。
datafansbj 2020-08-12
  • 打赏
  • 举报
回复
如果是在主窗体中创建的线程里显示 form2,form2 又是 Modal 状态的,那么你应该使用 BeginInvoke,而不是 Invoke,至于二者的区别,请自定百度。

另外在实际项目中要注意:如果更新 btnMode.Text 时,form2 已经关闭了,会引发异常(因为这段代码在另外线程里执行的),请使用 try。

this.BeginInvoke((EventHandler)(delegate
{
try
{
this.form2.btnMode.Text = "显示";
}
catch
{
}
}));
weixin_42107206 2020-08-11
  • 打赏
  • 举报
回复
引用 3 楼 wilson1966 的回复:
不用委托,在子窗体(form2) 把按钮btnMode 属性modifiers设为 public 即可供母窗体Call

From2 form2 = new Form2();
form2.btnMode.Text = "显示";



此方法有效,成功修改控件。
weixin_42107206 2020-08-11
  • 打赏
  • 举报
回复
引用 6 楼 datafansbj 的回复:
你的场景是什么?使用了线程?一般情况下调用窗体并修改窗体控件属性值这么写:
Form2 form2 = new Form2();
form2.btnMode.Text = "显示";
form2.ShowDialog(this);

this 是本窗体,form2 是子窗体。

是在主窗体的线程里面。以上方法实现不了。
EdsionWang 2020-08-11
  • 打赏
  • 举报
回复


        Form2 form2;
        private void 弹出新窗口按钮_Click(object sender, EventArgs e)
        {
            form2 = new Form2();
            form2.Show();
        }

        private void 设置子窗体属性按钮_Click(object sender, EventArgs e)
        {
            this.Invoke((EventHandler)(delegate
            {
                this.form2.textBox1.Text = "从父窗体设置的属性";
            }));

        }
EdsionWang 2020-08-11
  • 打赏
  • 举报
回复
贴你的完整代码。应该是你又new一个Form对象出来了
datafansbj 2020-08-11
  • 打赏
  • 举报
回复
你的场景是什么?使用了线程?一般情况下调用窗体并修改窗体控件属性值这么写:
Form2 form2 = new Form2();
form2.btnMode.Text = "显示";
form2.ShowDialog(this);

this 是本窗体,form2 是子窗体。
glen30 2020-08-11
  • 打赏
  • 举报
回复
子窗体写一个接口函数来做设置操作,在父窗体里面通过invoke的方式调用子窗体的接口
小白卟白 2020-08-11
  • 打赏
  • 举报
回复
public partial class Form2 : Form { public static TextBox text = new TextBox(); public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { textBox1.Text = text.Text; } } public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Form2.text.Text = "txtName"; } }
wilson1966 2020-08-11
  • 打赏
  • 举报
回复
不用委托,在子窗体(form2) 把按钮btnMode 属性modifiers设为 public 即可供母窗体Call

From2 form2 = new Form2();
form2.btnMode.Text = "显示";

小白卟白 2020-08-11
  • 打赏
  • 举报
回复
可以在form2中加一个静态变量 ,form1赋值,form2取值;
Lyman.cn 2020-08-11
  • 打赏
  • 举报
回复
From2 form2 = new Form2(); this.Invoke((EventHandler)(delegate { this.form2.btnMode.Text = "显示"; }));

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧