C#从静态void访问控件属性
我有带按钮和复选框的表单。若我点击按钮,则调用static void,调用non-static void,显示带有复选框的messagebox.checked.toString() 问题是,如果我更改复选框值,它总是显示false 代码是C#从静态void访问控件属性,c#,static,C#,Static,我有带按钮和复选框的表单。若我点击按钮,则调用static void,调用non-static void,显示带有复选框的messagebox.checked.toString() 问题是,如果我更改复选框值,它总是显示false 代码是 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void y()
{
MessageBox.Show(checkBox1.Checked.ToString());
}
static void x()
{
Form1 f = new Form1();
f.y();
}
private void button1_Click(object sender, EventArgs e)
{
x();
}
}
}
我猜你可能和我一样来自Visual Basic背景 在C#中,表单只是表单类的实例,它们没有VB6时代那样的特殊地位 调用
newform1()
时,基本上是在创建一个new表单,而不是访问同一表单。任何表单都可以有多个实例,因为它实际上只是下面的一个C#类
您可以通过使x()方法将当前形式作为参数来解决此问题
static void x(Form1 theForm)
{
theForm.y();
}
private void button1_Click(object sender, EventArgs e)
{
x(this);
}
表单类中的this参数指向表单实例本身
在创建表单时,您现在应该获得正确的值,而不是默认值
我想您需要将x()
设置为static
,不是吗?但如果不是这样,从x()
中删除static
可能是更好的解决方案
void x()
{
this.y();
// or you can just omit the this qualifier and call just y();
}
这是因为在x()中实例化新的Form1时,请尝试将“this”作为参数传递给x方法。您正在创建一个新的Form1实例。你为什么这么做?创建新表单时,也会创建一个新复选框。表单上的复选框默认设置为false(未选中),因此,每次创建表单的新实例时,它都显示为false。方法x实例化一个新表单。新表单上的复选框也将是新的(使用表单创建),默认值为false 你到底想干什么?为什么在按下按钮时创建新表单?如果确实要这样做,则需要在调用form f=new Form1()后设置新表单的复选框状态 试试看
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void y()
{
MessageBox.Show(checkBox1.Checked.ToString());
}
static void x(Form f)
{
f.y();
}
private void button1_Click(object sender, EventArgs e)
{
x(this);
}
}
y()
中的复选框1
与您在x
中创建的格式完全不同。只需去掉x()
,它就可以工作了:
private void button1_Click(object sender, EventArgs e)
{
y(); // not x();
}
您的问题在x()方法中,您在那里所做的实际上是创建一个全新的表单,并选中该表单复选框,这显然会实例化为false。
与其调用x(),不如调用y()
或者,也可以将messagebox.show放在按钮单击方法本身中。如果需要从静态方法访问某个表单实例,则需要将对该表单的引用保存在某处
class Program
{
public static Form thatForm;
public static void Main(string[] args)
{
MyForm form = new MyForm();
thatForm = form;
Application.Run(form);
}
}
class MyForm : Form
{
void Foo()
{
Program.thatForm.somethingPublic();
}
}
当然,如果他这样做的话,x也可以是一个静态方法,这样他就不必传入form对象,只需要从编译器pov中传递。不是从建筑的角度。