C#:尝试使用不同类中的控制元素 - “需要对象引用”
本文关键字:元素 控制 对象引用 同类 | 更新日期: 2023-09-27 17:56:35
我是C#的新手(如果我的问题很菜鸟,我深表歉意 - 我正在自学,所以这是一个颠簸的过程)。我正在尝试开发一个wform,由于有些方法很长,我试图将其保留在几个类中。这就是我希望实现的目标:
public partial class formMainForm : Form
{
public formMainForm()
{
InitializeComponent();
}
private void UpDown1_ValueChanged(object sender, EventArgs e)
{
longCalculations.LongMethod1();
}
}
public class longCalculations
{
private void LongMethod1()
{
// Arbitrarily long code goes here
}
}
我这样做是为了保持formMainForm
类整洁,并能够将任何计算拆分为可管理的块。但是,我在非表单类中使用表单控件(例如复选框、数字上下控件等)时遇到了问题。
如果我保持原样(例如 CheckBox1
)我得到一个名称在当前上下文中不存在的错误。我搜索了一下,发现这是因为该框是在不同的类中定义的。但是,如果我将其更改为 formMainForm.CheckBox1
,错误现在是非静态字段、方法或属性需要对象引用。再次,我环顾四周,这似乎是由于表单初始化方法不是静态的。
如果我将public formMainForm()
更改为static formMainForm()
,错误现在移动到InitializeComponent();
,我不知道从这里开始。我还尝试对 formMainForm()
方法进行实例化,但这没有任何作用(我尝试使用的代码如下。我在这个网站的某个地方找到了它作为类似问题的答案)。
private void formLoader(object sender, EventArgs e)
{
shadowrunMainForm runForm = new shadowrunMainForm();
runForm.Show();
}
如何在其他类中使用表单控件名称?
附言这是我在这里的第一篇文章 - 如果我错过了已经在某处被问到的这个问题,我非常抱歉。我确实搜索了,但没有找到我要找的东西。
编辑
似乎我没有说清楚 - 这只是代码的一个例子,我的问题在于第二类,而不是第一类。我现在已将代码简化为:
public partial class formMainForm : Form
{
public formMainForm()
{
InitializeComponent();
}
}
public class longCalculations
{
private void LongMethod1()
{
List<CheckBox> listOfBoxes = new List<CheckBox>();
listOfBoxes.Add(CheckBox1);
// The code displays an "object reference is required for the non-static field, method or property" error at this stage. Changing the "CheckBox1" to formMainForm.CheckBox1 doesn't help
// Arbitrarily long code goes here
}
}
LongMethod1
放置在formMainForm
分部类中时工作得很好。 将其移动到其他窗体使其无法从这些复选框中获取数据。
这一行longCalculations.LongMethod1();
抛出错误,因为您正在尝试访问实例方法,就好像它是一个static
方法一样,并且它被定义为private
在类之外无法访问的方法。在访问longCalculations
类的任何成员或方法之前,您需要创建一个实例,并将该方法标记为public
private void UpDown1_ValueChanged(object sender, EventArgs e)
{
longCalculations ln = new longCalculations();
ln.LongMethod1();
}
public class longCalculations
{
public void LongMethod1()
{
// Arbitrarily long code goes here
}
}
(或者)如果你真的希望它是一个static
的方法,那么用static
修饰符进行相应的定义,比如
public class longCalculations
{
public static void LongMethod1()
{
// Arbitrarily long code goes here
}
}
现在你可以像你尝试的那样称呼它
public static class longCalculations
{
public static void LongMethod1()
{
// Arbitrarily long code goes here
}
}
如果你要调用longCalculations.LongMethod1();
,那么你需要让你的类静态
或者通过调用将其保留为非静态方法
longCalculations lc = new longCalculations()
lc.LongMethod1();
至于访问单独类中的控件,您可以传入表单并使控件public
这可能是危险的。
因此,在您的 Form.designer.cs 上,将您可能必须public
的任何控件更改为修饰符。然后你会打这样的电话...
private void UpDown1_ValueChanged(object sender, EventArgs e)
{
longCalculations.LongMethod1(this);
}
public void LongMethod1(Form1 form)
{
// Arbitrarily long code goes here
form.label1.Text = someString;
//more settings and whatnot
}
或者做这样的事情:
public class longCalculations
{
public string LongMethod1()
{
// Arbitrarily long code goes here
return myString;
}
}
longCalculations lc = new longCalculations()
string result = lc.LongMethod1();
this.label1.Text = result;
理想情况下,longComputing 类不会尝试直接修改表单。相反,它将返回表单可用于更新其控件的对象。
如果需要直接从 longComputing 类访问窗体,请首先更改方法以接受窗体的实例
public void LongMethod1(formMainForm myForm)
然后,您可以将表单本身作为参数传递
var calc = new longCalculations();
calc.LongMethod1(this);
在另一个类中,你需要有一个formMainForm
类的实例:
var myForm = new formMainForm();
然后,您可以像这样访问其成员:
myForm.CheckBox1.Checked = true;