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

时间:2009-02-27 15:05:31

标签: c# static

我有按钮和复选框的表单。如果我点击按钮静态void调用非静态void,它显示带有checkbox.checked.toString()的消息框 问题是如果我更改复选框值,它总是显示错误

代码是

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();
        }



    }
}

8 个答案:

答案 0 :(得分:1)

我猜你可能来自像我这样的Visual Basic背景。

在C#中,form只是Form类的实例,它们没有像VB6那样的特殊状态。

当您致电new Form1()时,您基本上是在创建表单而非访问同一表单。任何表单都可以有多个实例,因为它实际上只是一个C#类。

您可以通过让x()方法将当前表单作为参数

来解决此问题
static void x(Form1 theForm)
{
    theForm.y();
}

private void button1_Click(object sender, EventArgs e)
{
    x(this);
}

表单类中的this参数指向表单实例本身。

现在,您应该在创建表单时获取正确的值而不是默认值。

我认为您需要x()static,不是吗?但如果不是这种情况,从static删除x()可能是更好的解决方案。

void x()
{
    this.y();

    // or you can just omit the this qualifier and call just y();
}

答案 1 :(得分:1)

方法x实例化一个新表单。新表单上的复选框也是新的(使用表单创建),默认值为false。

你到底想要做什么?为什么在按下按钮时创建新表单?如果你真的想这样做,那么你需要在调用Form f = new Form1()之后设置新表单的复选框状态;

答案 2 :(得分:0)

这是因为你在x()中实例化一个新的Form1,尝试将'this'作为参数传递给x方法。

答案 3 :(得分:0)

您正在创建一个新的Form1实例。你为什么这样做?创建新表单时,也会创建一个新复选框。默认情况下,表单上的复选框设置为false(未选中),因此,每次创建表单的新实例时,它都会显示为false。

答案 4 :(得分:0)

尝试

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);
    }

}

答案 5 :(得分:0)

checkbox1中的y()与您在Form1中创建的x完全不同。简单地摆脱x()它应该有效:

    private void button1_Click(object sender, EventArgs e)
    {
        y(); // not x();
    }

答案 6 :(得分:0)

你的问题是在x()方法中,你在那里做的实际上是创建一个全新的表单并检查表单复选框,这显然会实例化为false。 而不是调用x(),你应该调用y()。

或者,或者将messagebox.show放在buttonclick方法本身中。

答案 7 :(得分:0)

如果您需要从静态方法访问某个表单实例,则需要在某处保存对该表单的引用。

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();
  }
}