C# 试图弄清楚如何从其他类调用函数而不使其成为静态的
我试图从另一个包含另一个类的文件(nodes.cs)中更改主窗体中的列表框。我在我的主窗体中创建了一个类,它为我更改了文本框,所以我所需要做的就是将字符串传递给它。不幸的是,我无法从另一个类访问函数,除非我将字符串更改类设置为静态。如果将其设置为静态,则无法更改列表框而不会出现错误: 非静态字段、方法或属性需要对象引用 我知道这意味着我需要创建对象或使其非静态。我觉得整个班级的事情都很混乱。我必须启动一个全新的表单对象才能访问它?无论如何 如何从另一个类访问包含在另一个文件中的列表框?这两个类位于同一命名空间中 添加我所拥有的东西没有真正的意义,这是一个巨大的代码量,我删除了我已经尝试过的所有东西C# 试图弄清楚如何从其他类调用函数而不使其成为静态的,c#,C#,我试图从另一个包含另一个类的文件(nodes.cs)中更改主窗体中的列表框。我在我的主窗体中创建了一个类,它为我更改了文本框,所以我所需要做的就是将字符串传递给它。不幸的是,我无法从另一个类访问函数,除非我将字符串更改类设置为静态。如果将其设置为静态,则无法更改列表框而不会出现错误: 非静态字段、方法或属性需要对象引用 我知道这意味着我需要创建对象或使其非静态。我觉得整个班级的事情都很混乱。我必须启动一个全新的表单对象才能访问它?无论如何 如何从另一个类访问包含在另一个文件中的列表框?这两个类位
MAIN.CS
namespace neuralnetwork
{
public partial class mainform : Form
{
yada yada
public static void changetext(string text)
{
listbox1.items.add(text);
}
}
}
中学
namespace neuralnetwork
{
class lolercopter
{
public static void dolol()
{
//here is where I want to change the mainforms textbox.
mainform.changetext(s);
}
}
}
这基本上就是我所拥有的。我已经读了一个多小时了 类就像蓝图 你所问的就像是问如何打开蓝图上大厅的门
听起来您希望一个窗体上的操作触发另一个窗体上的操作或更改状态。这可以通过将状态存储在数据库或内存中来实现,但理想情况下可以通过引用实例化的mainform来实现。类就像蓝图 你所问的就像是问如何打开蓝图上大厅的门
听起来您希望一个窗体上的操作触发另一个窗体上的操作或更改状态。这可以通过将状态存储在数据库或内存中来实现,但最好是通过引用实例化的mainform来实现。您的
节点如何创建?它是由表单创建的吗?如果是这样,您可以在创建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 );
...
}
}
基本思想是通过构造函数向类提供它需要访问的资源,这样就不必使用长期存在的对象引用和静态类
编辑:我已经更新了这个,以反映您的代码示例。请注意,您并没有在表单中提供一个新类来更改列表框,而是提供了一个方法。您的节点是如何创建的?它是由表单创建的吗?如果是这样,您可以在创建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 );
...
}
}
基本思想是通过构造函数向类提供它需要访问的资源,这样就不必使用长期存在的对象引用和静态类
编辑:我已经更新了这个,以反映您的代码示例。请注意,您并没有在表单中提供一个新类来更改列表框,而是提供了一个方法。您可以将对mainform的引用传递到您的方法中:
public static void dolol(mainform frm)
{
frm.changetext(s);
}
您的问题使我怀疑此应用程序存在一些严重的体系结构问题,但希望此解决方案能对您起作用。您可以将对mainform的引用传递到您的方法中:
public static void dolol(mainform frm)
{
frm.changetext(s);
}
您的问题让我怀疑此应用程序存在一些严重的体系结构问题,但希望此解决方案能为您提供帮助。请从您现有的内容中添加一些示例代码。您需要对mainform实例进行引用,在某个地方您将执行以下操作:mainform f=new mainform();有了它,您就可以使用它的实例成员,比如您的方法。f、 变更文本(“某物”);等等……对,理查德。我明白,我写了这个。但是,如果我在第二个类中使用mainform f=newmainform(),我不仅不能访问listbox(VisualStudio没有将其列为选项),而且这不会创建一个全新的表单吗?不是引用?好吧,我只是尝试了一下,得到了“blah blah.exe中发生了一个未处理的异常(StackOverflow)”。基本上,根据我的理解,我在第二类的第一类中创建了一个新对象,这在第一类中创建了第二类的一个新对象,依此类推。我不确定这是如何可行的。您的changetext
方法绝对不应该是静态的,因为它专门与listbox1
控件关联,该控件位于您的mainform
类的特定实例上。请从您现在拥有的内容中添加一些示例代码。您需要对您的mainform实例的引用,在某个地方,您将执行以下操作:mainform f=newmainform();有了它,您就可以使用它的实例成员,比如您的方法。f、 变更文本(“某物”);等等……对,理查德。我明白,我写了这个。但是,如果我在第二个类中使用mainform f=newmainform(),我不仅不能访问listbox(VisualStudio没有将其列为选项),而且这不会创建一个全新的表单吗?不是引用?好吧,我只是尝试了一下,得到了“blah blah.exe中发生了一个未处理的异常(StackOverflow)”。基本上,根据我的理解,我在第二类的第一类中创建了一个新对象,它在第二类中创建了一个新对象