C# 从另一个类调用公共方法不会';不回答

C# 从另一个类调用公共方法不会';不回答,c#,.net,C#,.net,我正在用C#制作一个游戏库 我有一个主窗体,它有一个FlowLayoutPanel,它承载着游戏库。在主窗体中有一个“addgame”方法,它向FlowLayoutPanel添加一个项,但这个方法是从第二个窗体调用的。但是当我从第二个表单调用这个方法时,什么都不会发生,但是如果从主表单调用,它会工作 代码如下: 以下是mainForm中的添加游戏方法: public void addIso() { PictureBox gameBox = new PictureB

我正在用C#制作一个游戏库

我有一个主窗体,它有一个FlowLayoutPanel,它承载着游戏库。在主窗体中有一个“addgame”方法,它向FlowLayoutPanel添加一个项,但这个方法是从第二个窗体调用的。但是当我从第二个表单调用这个方法时,什么都不会发生,但是如果从主表单调用,它会工作

代码如下:

以下是mainForm中的添加游戏方法:

    public void addIso()
    {
        PictureBox gameBox = new PictureBox();
        gameBox.ImageLocation = "link here";
        gameBox.Height = 200;
        gameBox.Width = 150;
        gameBox.SizeMode = PictureBoxSizeMode.StretchImage;
        isoPanel.Controls.Add(gameBox);
    }
此方法向FlowLayoutPanel添加一个名为isoPanel的占位符游戏。从同一窗体调用时工作

下面是如何从第二种形式调用该方法:

    private void addGameButton_Click(object sender, EventArgs e)
    {
        MainWindow mainForm = new MainWindow();
        mainForm.addIso();
    }
当我尝试在方法中添加简单的消息框时,消息框确实显示了出来,但游戏并没有添加到FlowLayoutPanel中

有什么建议或解决方案吗


我为我糟糕的英语和混乱的编程术语道歉,我刚刚开始学习C。

加载第二个表单时,您似乎正在重新创建表单。 因为这确实缺少一点背景

我建议你有一个主踏板,它将运行两种形式

创建游戏管理器类Ex:GameManager.cs

在类中,为两个窗体创建一个变量,并将它们设置为受保护

在每个表单中,向其发送gamemanager的引用

这将允许每个窗口通过管理器相互通信,从而提供安全的相互通信

让我知道,如果你想要一些来源与此

您可以通过使用
delegate
delegate
来实现这一点

您在这里做错了什么:

addGameButton
单击事件,您正在创建mainForm的新实例。它不是您当前看到的实际主窗体,而是主窗体的不同实例。您的代码将控件添加到布局中,只需通过调用
mainForm.Show()
来确认这一点,这将使用该控件打开一个新表单

你能做什么:

在这种情况下,要修改父控件,调用父类中的方法,需要通过以下方式使用委托:

更改需要应用于父类,即,
main窗口

  • 定义委托和该委托类型的事件

    public delegate void UpdateUiDelegate();
    public event UpdateUiDelegate UpdateUiEvent; 
    
  • 将所需的方法分配给事件(最好在构造函数中使用此方法):

  • 下一步工作是子表单,即
    Form2
    (使用更好的名称,让它成为
    ImageChildControl
    )。在那里创建一个委托:

    public Delegate ControlCreator;
    
  • 返回MainWindow,找到调用第二个窗体的位置,在创建子窗体的实例后,将创建的事件分配给该实例的代理,为此,请使用以下代码:

    ImageChildControl ImageChildControlInstance = new  ImageChildControl();
    ImageChildControlInstance.ControlCreator = UpdateUiEvent; 
    
  • 还有一项工作要做,那就是儿童形式;从按钮单击事件调用代理。即

    private void addGameButton_Click(object sender, EventArgs e)
    {
        ControlCreator.DynamicInvoke(); 
    }
    
    现在您可以看到您的代码按预期工作


  • 如果没有MainWindow的代码,我假设这是因为您正在创建一个新的MainWindow实例。尝试调用
    mainForm.addIso()
    到当前实例化的MainWindow实例?我的意思是,
    this
    是一个非常有用的关键字,而不是在program.cs中调用主窗体。调用game manager类,让它设置两个窗体,然后将控制权移交给事件系统。当你使用按钮等…嘿,谢谢你解释我做错了什么,现在我至少明白了什么是错的。感谢您提供的代码片段,但我似乎无法在任何地方插入“LogoutDelegateEvent+=newlogoutdelegateevent(addIso);”。它说它在当前上下文中不存在。实际上我试过了,但它仍然显示“LogoutDelegateEvent在当前上下文中不存在”查看更新
    UpdateIevent
    是您的事件
    LogoutDelegateEvent
    不在场景中非常感谢,它起了作用。起初,我没有注意到你编辑了这篇文章。哈哈,很高兴能帮助你
    private void addGameButton_Click(object sender, EventArgs e)
    {
        ControlCreator.DynamicInvoke(); 
    }