我如何在"点击按钮"之间共享变量? 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;
}
}
}
如何让全班同学更新??
答案 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()
{
...