如何在表单上创建一个按钮从另一种形式启用?

时间:2013-12-16 00:17:20

标签: c# button

我正在制作一个菜单,为每个级别打开新表单。当你完成一个级别时,它应该通过一个消息框(它确实)祝贺你,然后在不同的菜单表单上启用下一级别的按钮。所以我访问了设计师并将按钮公开并尝试:

new LevelMenu().button2.Enabled = true;

但那没用。 我也尝试过:

public event Action levelCompleted;
//then down lower i did (after it is declared that you won the level):
if (levelCompleted != null)
    levelCompleted();
W1L1.levelCompleted += () => LevelMenu.button2.Enabled = true;

但是这给我的错误是: 非静态字段,方法或属性'The_Levels.W1L1.levelCompleted'

需要对象引用

我正在使用的表单是“W1L1”,而“LevelMenu”是菜单表单。提前致谢

3 个答案:

答案 0 :(得分:0)

您基本上需要引用 LevelMenu 的实例。 因此,当您创建“W1L1”表单时,您可能只需将 LevelMenu 传递给它。

public class W1L1
{
    private readonly LevelMenu _levelMenu;

    public W1L1(LevelMenu levelMenu)
    {
        this._levelMenu = levelMenu;
    }

    //Where you want to enable the button
    this._levelMenu.button2.Enabled = true;
}

这不是建筑方式的最佳解决方案,但它有效。

但如果你创建一个更多的OOP方式来启用下一级别的按钮会更好。

答案 1 :(得分:0)

当您打开下一个级别时,将其作为单独的对象打开,作为新表单。现在,当级别完成后,您可以从原始类访问该表单上的公共控件。这样的事情可能会有所帮助:

LevelMenu NextLevel = new LevelMenu();
public event Action levelCompleted;
if (levelCompleted != null)
    levelCompleted();
NextLevel.button2.Enabled = true;

答案 2 :(得分:0)

这就是我所做的,我希望这会有所帮助

我创建了2个表单

Form1 =菜单是(按钮),Form2 =游戏等级(即等级1)

然后在Form2中我添加了一个偶数LevelCompleted,它会通知form1玩家完成了这个级别

  //add this to form2
  //the delegate 
  public delegate void LevelCompleted(Int32 level);

  //the event
  public event LevelCompleted LevelCompletedEvent;

然后在Form1(菜单表单)上创建Form2的实例(有事件)订阅它并创建一个处理程序,在我的情况下,我在创建Form2的实例后添加它

  private void button1_CLick(object sender, EventArgs e)
  {
    Form2 level1 = new Form2();
    level1.LevelCompletedEvent += new Form2.LevelCompleted(level1_LevelCompletedHandler);
    level1.Show();
   }

   //and this is the handler method
   void level1_LevelCompletedHandler(int level)
   {
      //the logic for controlling the button states
      // the level parameter can be used to indicate what is the current level completed.
      if(level == 1)
      {
        button1.Enabled = false;
        button2.Enabled = true;
      }
     }

注意:在Form2(游戏级别)中,我创建了一个可以在未完成游戏时使用的野外游戏    如果他被允许进入下一级别,您必须在此表格中提出事件以通知Form1(菜单)
   他(用户)完成了级别,Form1将执行方法level1_LevelCompletedHandler(int level)。

我知道这个问题没有得到很好的解释,但我希望我能就这个事件给你一个想法。