C# 从子类调用公共父函数
在我的C# 从子类调用公共父函数,c#,parent-child,C#,Parent Child,在我的Main方法中,我正在实例化UpdateDialog类,该类基于用户是否按下按钮,我需要从Main调用function1()。代码如下: public partial class Main : Form { public void function1() { doing_stuff_here(); } private void button1_Click(Object sender, EventArgs e) { var update = new Up
Main
方法中,我正在实例化UpdateDialog
类,该类基于用户是否按下按钮,我需要从Main
调用function1()。代码如下:
public partial class Main : Form
{
public void function1()
{
doing_stuff_here();
}
private void button1_Click(Object sender, EventArgs e)
{
var update = new UpdateDialog();
update.ShowDialog();
}
}
public partial class UpdateDialog : Form
{
private void button2_Click(object sender, EventArgs e)
{
//call here function1() from Main
}
}
我应该怎么做才能从分部类UpdateDialog
中的Main
调用function1()
LE:虽然Styxxy建议的方法似乎是正确的,但它在我的应用程序中不起作用,因为跨线程无效操作
,所以我最终使用了Cuong LE建议的代理解决方法。你必须在UpdateDialog
表单中有一个Main
表单的实例。正如您所说的UpdateDialog是主窗体的子窗体,我想您应该在主窗体中创建UpdateDialog并在那里进行演示。在显示该表单之前,您可以指定
出现错误ArgumentException:无法将顶级控件添加到控件。
。现在可以用两种方法来解决这个问题
您可以在主窗体上将属性设置为false
(我不太喜欢这个)
您可以将该属性用于主窗体(this
)。下面是两种方法
您可以手动设置所有者
:
updateDialog.Owner = this;
或者您可以将此
作为参数添加到或方法中;这样,也可以设置所有者
updateDialog.Show(this);
// or
updateDialog.ShowDialog(this);
“完整”代码表示:
var updateDialog = new UpdateDialog();
// Do other stuff here as well
updateDialog.Owner= this;
updateDialog.ShowDialog(); // or use .Show()
// or
updateDialog.ShowDialog(this); // or use .Show(this)
方法#1
您需要创建类Main
的实例
Main foo = new Main();
foo.function1();
进近#2
您需要将该方法声明为静态
public static function1(){ ... }
....
Main.function1();
将Main
类实例传递到更新表单,并将其存储在实例变量中-
Main mainWindow = null;
public UpdateDialog(Main mainForm)
{
mainWindow = mainForm;
}
private void button2_Click(object sender, EventArgs e)
{
mainWindow.function1();
}
并从主要方法入手-
private void button1_Click(Object sender, EventArgs e)
{
var update = new UpdateDialog(this);
update.ShowDialog();
}
ShowDialog()方法返回一个DialogResult,您可以在对话框关闭后调用函数1
可以像引用一样传递主类
例如:
public partial class Main : Form
{
//make it internal, if UpdateDialog in the same assembly, and it only one that would use it. In other words hide it for outside world.
internal void function1()
{
doing_stuff_here();
}
....
}
public partial class UpdateDialog : Form
{
private MainForm _main = null;
public UpdateDialog (MainForm main) { //Accept only MainForm type, _not_ just a Form
_main = main;
}
private void button2_Click(object sender, EventArgs e)
{
_main.function1(); //CALL
}
}
像这样的。您可以根据自己的具体需求进行更改,但这是一个一般的想法。我建议您在UpdateDialog
中创建一个事件,然后在Main
类中创建一个实例后订阅它。这样,这两个类之间就有了更好的分离
public partial class Main
{
public void function1()
{
doing_stuff_here();
}
private void button1_Click(object sender, EventArgs e)
{
var update = new UpdateDialog();
update.OnButton2Click += OnUpdateDialogButton2Click;
update.ShowDialog();
}
void OnUpdateDialogButton2Click(object sender, EventArgs e)
{
function1();
}
}
public partial class UpdateDialog
{
public event EventHandler<EventArgs> OnButton2Click;
private void button2_Click(object sender, EventArgs e)
{
//call here function1() from Main
if (OnButton2Click != null)
{
this.OnButton2Click(this, e);
}
}
}
公共部分类Main
{
公共职能1()
{
在这里做事;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var update=new UpdateDialog();
update.OnButton2Click+=onUpdate对话框button2click;
update.ShowDialog();
}
void onUpdate对话框按钮2单击(对象发送者,事件参数e)
{
功能1();
}
}
公共部分类UpdateDialog
{
公共事件事件处理程序OnButton2单击;
私有无效按钮2\u单击(对象发送者,事件参数e)
{
//在这里从Main调用function1()
如果(OnButton2Click!=null)
{
this.onbutton2点击(this,e);
}
}
}
您可以将其转过来,让主窗体监听来自UpdateDialog的单击
大体上:
private void button1_Click(Object sender, EventArgs e)
{
var update = new UpdateDialog();
update.OnSomethingClicked += function1;
update.ShowDialog();
}
void form_OnSomethingHappened(object sender, EventArgs e)
{
// Do the stuff you want
}
在UpdateDialog中:
public event EventHandler OnSomethingHappened;
private void button2_Click(object sender, EventArgs e)
{
EventHandler handler = OnSomethingHappened;
if (handler != null) handler(this, e);
}
您可以将function1设置为分部方法,这样您就可以在所有分部类中使用它
分部方法允许在一个文件中定义方法,并允许在另一个文件中选择性地定义方法体。它们只能在部分类中使用,并且在C#3.0和Visual Basic 9.0中作为语言功能引入,这两个版本与.NET Framework 3.5和Visual Studio 2008一起提供
所以你能做的就是这样修改
public partial class Main : Form
{
public partial void function1()
{
doing_stuff_here();
}
private void button1_Click(object sender, EventArgs e)
{
var update = new UpdateDialog();
update.ShowDialog();
}
}
public partial class UpdateDialog : Form
{
public partial void function1();
private void button2_Click(object sender, EventArgs e)
{
function1();
}
}
-1表示var
。我们知道这里物体的类型。使用var
@AndreasJohansson没有意义:为什么我们不能在这里使用var
。var是首选的,因为我们可以看到正在实例化的对象。声明该类型将是重复的。@AndreasJohansson它仅用于代码示例,并使代码尽可能简短。如果您不喜欢var
这个词,请不要使用它。。。(无论如何,这不是本主题的重点)。因此,向下投票与向下投票相同,因为您在类的私有字段前面加上(或选择任何其他示例)…使用对象
和变量
是完全不同的。请再读一遍文档,因为你真的不知道它到底是做什么的。关于代码的丑陋性:这是个人的观点,但我的观点是,放两次相同的类型,只会弄乱代码。在var i=0的情况下,您没有使用var
是正确的代码>我完全同意,但在这种情况下,这是完全好的。
public partial class Main : Form
{
public partial void function1()
{
doing_stuff_here();
}
private void button1_Click(object sender, EventArgs e)
{
var update = new UpdateDialog();
update.ShowDialog();
}
}
public partial class UpdateDialog : Form
{
public partial void function1();
private void button2_Click(object sender, EventArgs e)
{
function1();
}
}