我是C#的新手(如果我的问题是愚蠢的话,我道歉 - 我自己教我,这是一个坎坷的过程)。我正在尝试开发一个winform,因为有些方法很长,我试着将它保存在几个类中。这就是我希望实现的目标:
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();
}
如何在其他类中使用formcontrol名称?
P.S。这是我在这里发表的第一篇文章 - 如果我错过了这个已被问到某个地方的问题,我感到非常抱歉。我做了搜索,但我找不到我想要的东西。
似乎我没有说清楚 - 这只是代码的一个例子,我的问题是第二类,而不是第一类。我现在已将代码简化为:
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
完全正常。将其移动到另一种形式使其无法从这些复选框中获取数据。
答案 0 :(得分:5)
我认为此行longCalculations.LongMethod1();
引发错误,因为您尝试访问实例方法,就好像它是static
方法一样,并且它被定义为{{1在课堂外无法访问的方法。您需要在访问其任何成员或方法之前创建private
类的实例,并将方法longCalculations
标记为
public
(OR)如果您真的希望它是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
现在你可以像你正在尝试一样调用它
答案 1 :(得分:2)
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;
答案 2 :(得分:1)
在您的其他课程中,您需要拥有formMainForm
课程的实例:
var myForm = new formMainForm();
然后您可以像这样访问其成员:
myForm.CheckBox1.Checked = true;
答案 3 :(得分:1)
理想情况下,您的longCalculations类不会尝试直接修改表单。相反,它将返回一个表单可用于更新其控件的对象。
如果您需要直接从longCalculations类访问表单,请先更改方法以接受表单实例
public void LongMethod1(formMainForm myForm)
然后您可以将表单本身作为参数传递
var calc = new longCalculations();
calc.LongMethod1(this);