Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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#_Winforms - Fatal编程技术网

C# 如何在两个窗体之间共享整数声明?

C# 如何在两个窗体之间共享整数声明?,c#,winforms,C#,Winforms,我目前正在WFA的c#中制作一些基本的增量游戏。代码如下: namespace Xadrs { public partial class Form1 : Form { public void Ref() { label2.Text = Points.ToString(); button2.Text = "Level up! (" + Upgradeprice.ToString() + ")"; label4.Text = Upg

我目前正在WFA的c#中制作一些基本的增量游戏。代码如下:

namespace Xadrs
{
public partial class Form1 : Form
{


    public void Ref()
    {
        label2.Text = Points.ToString();
        button2.Text = "Level up! (" + Upgradeprice.ToString() + ")";
        label4.Text = Upgrade.ToString();
        label6.Text = Upgradeautoclick.ToString();
        button4.Text = "Level up PPS! (" + Upgradeautoclickprice.ToString() + ")";
    }
    public int ach_beginner = 0;
    public int ach_intermediate = 0;
    public int ach_expert = 0;
    public int ach_master = 0;



    int Points = 0; 
    int Upgrade = 1;
    int Upgradeautoclick = 0 ;
    int Upgradeautoclickprice = 110;
    int Upgradeprice = 25;


    public Form1()
    {
        InitializeComponent();
        Ref();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (Upgrade == 5)
        {
            Points++;
            Ref();
        }


    }

    private void button1_Click(object sender, EventArgs e)
    {
        Points += Upgrade;
        Ref();


    }



    private void button2_Click(object sender, EventArgs e)
    {
        if (Points >= Upgradeprice)
        {
            Upgrade += 1;
            Points -= Upgradeprice;
            Upgradeprice += Upgradeprice / 4;

        }
        else
        {
            MessageBox.Show("Not Enough Nico points...");
        }
        Ref();

        if (Upgrade == 5)
        {
            MessageBox.Show("Beginner: Reach 5 PPS.\nReward: AutoClick!", "ACHIEVEMENT UNLOCKED!");
            ach_beginner = 1;
            timer1.Enabled = true;
            Upgradeautoclick = 1;
            button4.Visible = true;
            Ref();
        }
    }

    Form2 achievements = new Form2();

    private void button3_Click(object sender, EventArgs e)
    {
        Form2.Show();            
    }

    private void button4_Click(object sender, EventArgs e)
    {
        if (Points >= Upgradeautoclickprice)
        timer1.Interval = timer1.Interval / 2;
        Points -= Upgradeautoclickprice;
        Upgradeautoclickprice += Upgradeautoclickprice;
    }
在表格2中,我想要:

    if (ach_beginner = 1) 
    {
        //Text in this label = something like: Beginner - Reach 5 Points per click
        labelwithachievement.Visible = true;
    }

但是
ach\u初学者
没有在
form2
中声明。我想以某种方式“连接”这个整数,使其声明来自
form1
中的
form2

您只需要一个参数。您可以调用
Form2.Show
方法。与任何其他方法一样,形式2的方法可以成为参数。因此,在表格2中,您可以执行以下操作:

public void Show(int ach_beginner)
{       
   //Do sth. with your int

   this.Show();
}
如果现在在Form1上调用Form2,则可以传递整数:

private void button3_Click(object sender, EventArgs e)
{
   Form2.Show(ach_beginner);            
}
我认为这是最简单的方法。您也可以创建一个属性,而不是重写Show方法。在表格2中声明:

public int AchBeginner {get;set;}
在Form1中,在调用Show方法之前设置此值:

private void button3_Click(object sender, EventArgs e)
{
   Form2.AchBeginner = ach_beginner;
   Form2.Show();            
}
正如David在评论中解释的,该值不会在Form2上更新。如果要实现这一点,可以使用以下接口:

public interface IBeginner
{
   int AchBeginner{get;set;}
}

public void Form1 : Form, IBeginner
{
   public int AchBeginner{get;set;}

   //The place you create Form2
   Form2.Beginner = this;
}

public void Form2 : Form
{
   public IBeginner Beginner{get;set;}

   //Here you can access
   int achBeginner = Beginner.AchBeginner:
}
更新

根据问题作者的评论,我认为事件是最有用的想法。所以你可以告诉你的Form2你在Form1上的角色达到了5级。例如:

public class LevelEventArgs : EventArgs
{
   public int Level {get;}

   public LevelEventArgs(int level)
   {
      Level = level;
   }
}

//Form1 need to implement an Event which later can notify any subscriber (Form2 in this case)
public class Form1 : Form
{
   public event EventHandler<LevelEventArgs> LevelUp;

   //When your character reach new level do following:
   LevelUp?.Invoke(this, new LevelEventArgs(ach_beginner));

   //Show Form2
   Form2 form = new Form2(this);
   form.Show();
}

不要将其视为共享整数本身,而应将其视为
Form2
依赖于
Form1
中的某些内容

由于变量当前是公共的(我们将在一分钟内讨论),因此最简单的方法就是提供
Form2
,并引用
Form1
的实例。将属性置于
Form2
上,并在其构造函数中要求一个值:

private Form1 form1Instance;

public Form2(Form1 form1)
{
    this.form1Instance = form1;
}
然后,在创建
Form2
的实例时,将对
Form1
的当前实例的引用传递给它:

Form2 achievements = new Form2(this);
if (this.form1Instance.ach_beginner == 1)
然后在
Form2
中,您可以引用其新成员变量以从
Form1
获取信息:

Form2 achievements = new Form2(this);
if (this.form1Instance.ach_beginner == 1)

关于公共变量的注释。。。通常认为公开属性而不是变量是最佳实践。因此,请将其替换为:

public int ach_beginner = 0;
为此:

public int Ach_Beginner { get; set; }
并相应地更新对它的引用。这有多种原因,但最终的想法是类应该隐藏其值并提供对它们的访问,而不仅仅是提供值本身


这是为对象提供依赖关系的一个非常简单的开始,您可以从这里开始做很多事情。例如,如果不希望将整个表单作为依赖项传递(因为它们包含的数据/功能比依赖项所需的数据/功能多得多),则可以将值封装在它们自己的对象中,并将该对象作为依赖项传递

由此推断,您可以继续将业务逻辑与UI元素(如表单和控件)分离,并开始将逻辑移动到这些业务逻辑对象和组件中。这将使您的逻辑更易于移植到其他UI平台上,更易于测试,等等

例如,假设您有一个类,例如:

public class LevelInfo // guessing on an appropriate name here
{
    public int Ach_Beginner { get; set; }
    public int Ach_Intermediate { get; set; }
    public int Ach_Expert { get; set; }
    public int Ach_Master { get; set; }
}
然后在
Form1
中使用该对象:

private LevelInfo levelInfo = new LevelInfo();

// elsewhere...

levelInfo.Ach_Beginner = 1;
// etc.
然后
Form2
可能需要引用该对象:

if (this.levelInfo.Ach_Beginner == 1)
并使用该对象:

if (this.levelInfo.Ach_Beginner == 1)

此时,
LevelInfo
与UI分离,可以包含可移植的业务逻辑/信息。

这是通过值传递的。如果
Form1
上的值发生变化,它将不会在
Form2
的实例上更新@David,为什么在这种情况下会出现问题?@Servy:我不知道,因为我不完全知道该应用程序是如何使用的,但这可能是一个问题,当然值得注意。@David他对更新此值一无所知。所以我想这是可行的。如果该值变为更新,他将需要ref或events,您是对的。@David当您启动我的项目时,级别(int)为1,成就窗口(Form2)为空。在本例中,ach_初学者=0。当你达到第5级时,form1中的ach_初学者将值更改为1。现在,我需要更改表单2中标签的可见性。这就是我的意思。你的解决方案与你自己的解释相反。您已经声明了依赖于这一个值,但是您已经公开了一个完整的表单,充满了各种各样的行为,根本没有依赖性。因此,既然您意识到您提出的解决方案实际上不是一个好的解决方案,为什么要提出它?为什么不建议一个好的解决方案呢?我认为在这种情况下,接口是最好的解决方案。你说的“共享声明”是什么意思?