2009-02-27 19 views
0

我使用按钮和复选框来创建表单。如果我打按钮静态无效被称为其调用非静态无效,显示消息框与checkbox.checked.toString() 的问题是,如果我改变复选框值它总是显示虚假C#从静态访问控制属性void

代码是

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



    } 
} 

回答

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

} 
1

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

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

当你调用new Form1()你基本上是创建一个新的形式没有访问相同的形式。由于任何表单都可以有多个实例,因为它实际上只是一个C#类。

可以通过具有()方法只在当前形式作为参数

static void x(Form1 theForm) 
{ 
    theForm.y(); 
} 

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

的窗体类指向形式实例本身内该参数在x解决此问题。

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

我想你需要x()static,不是吗?但如果情况并非如此,从x()中删除static可能是更好的解决方案。

void x() 
{ 
    this.y(); 

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

当然,如果他这样做,x也可能是一个静态方法,所以他不必传入表单对象。 – Powerlord 2009-02-27 15:12:49

+0

补充说,谢谢! – chakrit 2009-02-27 15:33:47

0

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

0

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

1

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

你究竟想要做什么?为什么在按下按钮时创建一个新窗体?如果你真的想这样做,那么你需要在调用Form f = new Form1()后设置新窗体的复选框状态;

0

y()checkbox1是一个完全不同的Form1 - 你在x创建的。只要摆脱x(),它应该工作:

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

你的问题是在x()方法,你在做什么有实际制作一个全新的形式和检查的形式复选框,这显然被实例化为假。 而不是调用x()你应该调用y()。或者,也可以将messagebox.show放在buttonclick方法本身中。

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