2010-01-12 49 views
0

我试图从另一个包含另一个类的文件(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); 
    } 
    } 
    } 

这实质上就是我所拥有的。我一直在读超过这个一小时。

+0

请从你所拥有的添加一些代码示例现在 – curtisk 2010-01-12 15:04:18

+0

您需要在MainForm中的实例的引用,放在您做了什么样: 的MainForm F =新的MainForm(); 这是你可以使用它的实例成员,如你的方法。 f.changetext(“something”);等等...... – 2010-01-12 15:13:42

+0

对,理查德。我明白这一点,我写了这个。但是,如果我在辅助类中执行mainform f = new mainform(),不仅不能访问列表框(Visual Studio不会列出它作为选项),但是这不会创建一个完整的新表单吗?没有参考? – cam 2010-01-12 15:18:38

回答

1

你可以传递一个参考的MainForm到你的方法:

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

你的问题使我怀疑你有一些严重的体系结构问题与此应用程序,但希望这个解决方案可以为你工作。

+0

老实说,我有点啰嗦......我可以发誓我曾以不同的方式尝试了这么多次。感谢所有人。你们真棒:)(第一次在StackOverflow) 现在我只需要弄清楚如何在启动一个新的线程时传递参数;) – cam 2010-01-12 15:26:02

+0

也被称为通过该方法的依赖注入。 – 2010-01-12 15:47:23

1

类是像蓝图。

你问什么是喜欢问如何打开车门下来的蓝图大厅。

这听起来像你想一种形式的行动触发另一种形式的行动或改变的状态。这可以通过将状态存储在数据库或内存中来实现,但最好通过引用实例化的主表单来实现。

1

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

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

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

您可以更改Nodes类的构造函数,以便它接受对form的引用。这就是所谓的依赖注入,特别是构造注入。您的课堂对表格有依赖性,您在创建课程时提供表格。然后

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

你的节点类将使用助手为:

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

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

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

的基本思路是,以提供一流的,它通过构造需要访问的资源,所以你不必做使用长寿命的对象引用和静态类。

编辑:我已经更新这反映您的代码示例。请注意,您不是在表单中提供新类来更改列表框,而是提供一种方法。

相关问题