日期:2014-05-18  浏览次数:20605 次

刚学做CS程序,问一个关于C# CS模式窗口的问题

我在弹出模式窗体中想调用主窗体后台的一个AAA()函数

为什么我在新窗口中用

appmain form = new appmain()

form.aaa()

这样会把Appmain这个主窗体重新打开了一个

通过调试发现执行到appmain form = new appmain()的时候会把程序重新执行一遍

有没有什么解决方案的

------解决方案--------------------
新建弹出窗口时候传主窗口的ref进去,然后用这个ref去操作。
------解决方案--------------------
因为你在模式窗体里重新new主窗体了,所以这个对象和你主窗体对象不是同一个对象了。

你可以在模式窗体里定一个主窗体变量,把主窗口的对象传给模式窗体

如:frmChild frm = new frmChild();
frm.MainForm=this; //在模式窗体里定义主窗体变量public appmain MainForm;
frm.ShowDialog();

在模式窗体里,你就可以MainForm.aaa()了

------解决方案--------------------
frmChild frm = new frmChild();
frm.ShowDialog(this); 
在子窗体里这样调用就可以了。
this.Owener.aaa();
------解决方案--------------------
如果想让两个Form之间没有那么多的联系,可以使用下面的代码

// 假设Form1有一个button,点击button弹出Form2
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
// 使用Form2的Tag来保存Form1
f.Tag = this;
f.ShowDialog();
}

public void AAA()

}
}

// 假设Form2有一个button,在点击button时调用Form1的AAA函数
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
// 注意,Form2的构造函数中不能使用Form1的AAA函数,因为此时Form2的Tag还没有被赋值
}

private void button1_Click(object sender, EventArgs e)
{
Form1 f = this.Tag as Form1;
if (f != null)
f.AAA();
}
}

如果一定要在Form2的构造函数中使用Form1的AAA函数,可以给Form2写一个带参数的构造函数来实现,参数为Form1的对象
public Form2(Form1 f)
{
form1 = f;
}

private Form1 form1;

当然这时就不用再将Form2的Tag设置为Form1的对象了
------解决方案--------------------
弹出模式窗体时把主窗体传进去。
------解决方案--------------------
把A窗口当做参数传递到B窗口,这样在B窗口就能得到A窗口中的方法。