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