Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从子类调用公共父函数_C#_Parent Child - Fatal编程技术网

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();
                }
            }