C#从静态void访问控件属性

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

我有带按钮和复选框的表单。若我点击按钮,则调用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.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中传递。不是从建筑的角度。