试图找出如何从其他类调用函数而不使其静态

时间:2010-01-12 14:57:54

标签: c#

我正在尝试从另一个包含另一个类的文件(nodes.cs)中更改主窗体中的列表框。我在我的主窗体中创建了一个类,它为我更改了文本框,所以我需要做的就是将字符串传递给它。不幸的是,我无法从其他类访问该函数,除非我将String-changing-class设为静态。如果我将其设置为静态,则无法在不收到错误的情况下更改列表框: 非静态字段,方法或属性需要对象引用...

我知道这意味着我需要创建对象或使其成为非静态对象。我觉得全班的事情比较混乱。我必须启动一个全新的表单对象来访问它?反正。

如何从另一个文件中包含的另一个类访问列表框?这两个类位于同一名称空间中。

添加我拥有的东西并没有真正的意义,这是一个庞大的代码,我已经删除了我已经尝试过的所有内容......

MAIN.CS
    namespace neuralnetwork
{
    public partial class mainform : Form
    {
yada yada
public static void changetext(string text)
{
listbox1.items.add(text);
}
    }
    }

Secondary.cs

    namespace neuralnetwork
    {
    class lolercopter
    {
    public static void dolol()
    {
    //here is where I want to change the mainforms textbox.
mainform.changetext(s);
    }
    }
    }

这基本上就是我所拥有的。我已经读了一个多小时......

3 个答案:

答案 0 :(得分:1)

类就像蓝图。

你所要问的就是询问如何在蓝图上打开大厅的门。

听起来您希望在一个表单上执行操作来触发操作或在另一个表单上更改状态。这可以通过将状态存储在数据库或内存中来实现,但最好是通过引用实例化的主窗体来实现。

答案 1 :(得分:1)

您的nodes课程是如何创建的?它是由表单创建的吗?如果是这样,您可以在创建节点类时传入对表单的引用。

例如,假设您在表单中的回调中有此代码。

  var nodes = new Nodes();
  nodes.UpdateSomething( args );

您可以更改Nodes类的构造函数,以便它引用表单。这称为依赖注入,特别是构造函数注入。您的类依赖于表单,您在创建类时提供表单。

 var nodes = new Nodes( this ); // "this" is a reference to the form
 nodes.UpdateSomething( args );

您的Nodes类将使用帮助程序:

 public class Nodes
 {
     private Form TheForm { get; set; }

     public Nodes( Form form )
     {
          this.TheForm = form;
     }

     public void UpdateSomething( EventArgs args )
     {
         ...
         this.Form.ChangeText( newValue );
         ...
     }
}

基本思想是通过构造函数为类提供它需要访问的资源,这样你就不必使用长期的对象引用和静态类。

编辑:我已更新此内容以反映您的代码示例。请注意,您没有在表单中提供更改列表框的新类,而是更改方法。

答案 2 :(得分:1)

您可以将对mainform的引用传递给您的方法:

public static void dolol(mainform frm)
{
    frm.changetext(s);
}

您的问题让我怀疑您在使用此应用程序时遇到了一些严重的架构问题,但希望此解决方案可以为您提供帮助。