如何在WinForms应用程序中的成员之间共享变量(使用静态关键字)?

时间:2016-03-07 14:17:54

标签: c# winforms

我如何在"点击按钮"之间共享变量? WinForms应用程序中的函数?我试过阅读它,但我对此很新,并没有真正弄清楚 - 从我的理解,我必须使用静态关键字? 我真的不知道如何解释它,所以我只是展示一些简单的代码(它有错误,因为我不知道如何使它工作):

namespace stackoverflow
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Text = "Not clicked!";
            int number = 0;
        }
        private void label1_Click(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Clicked button 1.";
            number = 1;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            label1.Text = "Clicked button 2.";
            number = 2;
        }
    }
}

如何让全班同学更新??

7 个答案:

答案 0 :(得分:2)

由于您使用的是static类的相同实例,因此它们不必是Form1。由于事件处理程序是表单的属性而不是按钮的属性,因此您可以使用表单级成员来表示所有事件处理程序:

public partial class Form1 : Form
{
    private int number = 0;  // field at the form level
    public Form1()
    {
        InitializeComponent();
        label1.Text = "Not clicked!";
    }
    private void label1_Click(object sender, EventArgs e)
    {
    }

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Clicked button 1.";
        number = 1;
    }
    private void button2_Click(object sender, EventArgs e)
    {
        label1.Text = "Clicked button 2.";
        number = 2;
    }
}

答案 1 :(得分:1)

当您了解可访问性类型的含义时,它会有所帮助。

当某些东西被声明为静态时,这意味着该变量在应用程序的生命周期内占用内存中的单个位置。调用或分配该变量只会影响单个内存位置/偏移量。

正如您所说,非静态变量是'成员'一个类型的实例。 访问它们的方式的不同之处在于,您需要在变量前加上包含变量的类的实例。

theFormInstance.Number = 5;

或     this.Number = 5;

然而,使用类型名称引用静态变量。 我喜欢把它想象成属于' 静态变量'属于类型'非静态'属于'

类型的实例
Form1.Number= 5;

虽然是,但您可以使用静态变量,在此特定示例中您不应该这样做,因为您尝试更改的变量与Click事件位于同一Form类中。

只要变量在click事件处理程序/方法之外声明,但在封闭类中声明 - 那么Form1类中的所有方法都可以访问变量。

注意 - 我怀疑因为你点击按钮,你认为按钮不能看到表单类,因为它们是其他控件等。 要记住的是,当按钮触发事件处理程序时,请点击'要执行,它仍然是运行代码的Form。 例如:

MessageBox.Show(this.Name); 

这将返回表单的名称,无论您在表单中的哪个位置执行它,无论是在按钮单击事件还是在表单加载事件中。

如果你想从事件处理程序中抓取按钮,那么你可以使用' sender'变量来引用按钮。 (你需要将它转换为正确的类型。

例如

private void button2_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        label1.Text = "Clicked "+btn.Name;
        number = 2;
    }

无论如何,要知道这在几个方向发生,但希望它提供信息,并让您深入了解表格中的可访问性。 请记住 - 控件存在于Form中,因此它们可以同等地访问表单中声明的​​所有变量 - 只要它们在表单内部但在方法体之外。

答案 2 :(得分:0)

您拥有相同的班级实例。没有必要使用static,您只需要一个简单的字段,而不是使用本地字段:

public partial class Form1 : Form
{
  int number;

  ...
}

答案 3 :(得分:0)

把int number = 0;在类声明中而不是在构造函数中。 (例如,将其放在公共Form1()和公共部分类Form1 {行)

之间

答案 4 :(得分:0)

初始化表单函数之外的数字,如

namespace stackoverflow
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Text = "Not clicked!";
        }

        int number = 0;

        private void label1_Click(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "Clicked button 1.";
            number = 1;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            label1.Text = "Clicked button 2.";
            number = 2;
        }
    }
}

答案 5 :(得分:0)

基本上反驳其他人的话:

创建一个类并直接从包含属性和字段的类开始,在表单之间传递。我不会在你的Form.cs中放置一个字段/属性,除了顶部,只是为了保持它真的干净。我会检查WPF和MVVM模式,说实话,这是它擅长的地方,它真的是未来。我走了Winforms / WebForms的路线,现在只使用WPF / MVC开发,真的希望我会跳过其他东西。说实话,我只差两分钱。

答案 6 :(得分:-2)

在类级别而不是在本地声明变量。

public partial class Form1 : Form
{
    int number = 0;
    public Form1()
    {
        ...