我有按钮和复选框的表单。如果我点击按钮静态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();
}
}
}
答案 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();
}
}