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分部类中时工作得很好。 将其移动到其他窗体使其无法从这些复选框中获取数据。

C#:尝试使用不同类中的控制元素 - “需要对象引用”

我相信

这一行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;