C#:尝试在不同的类中使用控件元素 - "需要对象引用"

时间:2016-07-11 14:25:54

标签: c# winforms class

我是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完全正常。将其移动到另一种形式使其无法从这些复选框中获取数据。

4 个答案:

答案 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);