Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将方法的字符串参数从一个类传递到同一命名空间中的另一个类?_C#_Winforms_Class - Fatal编程技术网

C# 如何将方法的字符串参数从一个类传递到同一命名空间中的另一个类?

C# 如何将方法的字符串参数从一个类传递到同一命名空间中的另一个类?,c#,winforms,class,C#,Winforms,Class,一个愚蠢的小问题,但被困了很长时间。 我编写了两个类,一个是表单(TreeDisplay类),另一个包含构建逻辑(MyTreeNode类)。 TreeDisplay类包含浏览按钮,用于选择文件并将其传递给MyTreeNode类中的方法initiatingTree(字符串文件名)。 现在我必须将这个字符串参数文件名传递给MyTreeNode类。当我运行代码时,我选择的XML文件显示在文本框中,但不显示在treeview中。 我已经编写了部分代码,但它抛出了NullReferenceExceptio

一个愚蠢的小问题,但被困了很长时间。 我编写了两个类,一个是表单(TreeDisplay类),另一个包含构建逻辑(MyTreeNode类)。 TreeDisplay类包含浏览按钮,用于选择文件并将其传递给MyTreeNode类中的方法initiatingTree(字符串文件名)。
现在我必须将这个字符串参数文件名传递给MyTreeNode类。当我运行代码时,我选择的XML文件显示在文本框中,但不显示在treeview中。
我已经编写了部分代码,但它抛出了NullReferenceException(对象引用未设置为对象的实例)。 在Form.cs中写入整个代码时,代码运行成功,但在分离业务逻辑时发生异常。 你能告诉我哪里错了吗

这是TreeDisplay类(我的主窗体)的浏览按钮中的代码:

下面是MyTreeNode类中initiatingTree()的代码:

public class MytreeNodeClass
{

    private readonly System.Windows.Forms.TextBox txtFileName;
    private TreeView treeView1;
    private readonly ToolStripStatusLabel toolStripStatusLabel1;

   public string Filename
    {
        get { return filename; }
    }
    protected string filename;

    public MytreeNodeClass()
    {
    }

    public void initiatingTree(string nameofFile,TreeView treeView1)
    {
        try
        {
            //Create XML document & load the XML file.
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(nameofFile);
            treeView1 = new System.Windows.Forms.TreeView();
            treeView1.Nodes.Clear();

            if (xmlDocument.DocumentElement != null)
            {
                TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name);

                treeView1.Nodes.Add(treeNodedoc);
            }
在使用断点treeView1.Nodes.Clear()时,代码从这一行出来,并进入抛出NullReferenceException的catch块


请帮助查找异常的根本原因。谢谢。

在断点处TreeView的值是多少

我建议这可能是空的,因为该引用在您的业务逻辑层中不可用


更新了示例代码:

public void initiatingTree(string nameofFile, TreeView treeView1)
{
    try
    {
        //Create XML document & load the XML file.
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(nameofFile);

        treeView1.Nodes.Clear();

        if (xmlDocument.DocumentElement != null)
        {
            TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name);

            treeView1.Nodes.Add(treeNodedoc);
        }
    }
}
你把这个叫做:

if (open.ShowDialog(this) == DialogResult.OK)
{
    txtFileName.Text = open.FileName;
    MytreeNodeClass treenodeClass = new MytreeNodeClass();
    treenodeClass.initiatingTree(open.FileName, treeView1); 
}

在断点处TreeView的值是多少

我建议这可能是空的,因为该引用在您的业务逻辑层中不可用


更新了示例代码:

public void initiatingTree(string nameofFile, TreeView treeView1)
{
    try
    {
        //Create XML document & load the XML file.
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(nameofFile);

        treeView1.Nodes.Clear();

        if (xmlDocument.DocumentElement != null)
        {
            TreeNode treeNodedoc = new TreeNode(xmlDocument.DocumentElement.Name);

            treeView1.Nodes.Add(treeNodedoc);
        }
    }
}
你把这个叫做:

if (open.ShowDialog(this) == DialogResult.OK)
{
    txtFileName.Text = open.FileName;
    MytreeNodeClass treenodeClass = new MytreeNodeClass();
    treenodeClass.initiatingTree(open.FileName, treeView1); 
}

在访问TreeView对象之前初始化它。

在访问它之前初始化TreeView对象。

我猜你复制并粘贴了它,对吗

无论如何,这里有一点提示: 在VS Designer中拖动窗体上的控件时,VS“通常在InitializeComponent()中”为这些控件生成代码。VS在类(例如form1.cs)中编写引用,如下所示:

private System.Windows.Forms.TreeView treeView1;
这只是声明了一个System.Windows.Forms.TreeView类型的变量。这个变量(本身)存储在堆栈上,因为它只是一个引用,一个到目前为止不指向任何实际堆对象的引用(即NullReference)。现在,这个引用是无用的,除非您初始化它并告诉它指向堆上的真实对象,否则您不能使用它,这就是VS在设计器中为您所做的,它只是将下一行添加到InitializeComponents:

this.treeView1 = new System.Windows.Forms.TreeView();

这是您忘记复制到另一个类的行,它使您的引用未初始化(即仍然为NullReference),因此当您尝试使用它时,引发了NullReferenceException。我想这是你的问题,或者至少这是我能理解的。如果我不理解你,请原谅我

我猜你是复制粘贴的,对吧

无论如何,这里有一点提示: 在VS Designer中拖动窗体上的控件时,VS“通常在InitializeComponent()中”为这些控件生成代码。VS在类(例如form1.cs)中编写引用,如下所示:

private System.Windows.Forms.TreeView treeView1;
这只是声明了一个System.Windows.Forms.TreeView类型的变量。这个变量(本身)存储在堆栈上,因为它只是一个引用,一个到目前为止不指向任何实际堆对象的引用(即NullReference)。现在,这个引用是无用的,除非您初始化它并告诉它指向堆上的真实对象,否则您不能使用它,这就是VS在设计器中为您所做的,它只是将下一行添加到InitializeComponents:

this.treeView1 = new System.Windows.Forms.TreeView();
这是您忘记复制到另一个类的行,它使您的引用未初始化(即仍然为NullReference),因此当您尝试使用它时,引发了NullReferenceException。我想这是你的问题,或者至少这是我能理解的。如果我不理解你,请原谅我

正如c.k所说

作为标准,您没有从业务层访问usercontrols的权限。 为了简单起见,我建议您将控制代码保留在gui代码中

如何对代码进行排序的示例

(Gui层)用于控制交互的代码隐藏
用于数据操作的业务层
用于数据库操作的数据层,如c.k所说

作为标准,您没有从业务层访问usercontrols的权限。 为了简单起见,我建议您将控制代码保留在gui代码中

如何对代码进行排序的示例

(Gui层)用于控制交互的代码隐藏
用于数据操作的业务层

用于数据库操作的数据层等

我也这样做了,但没有任何更改。我也这样做了,但没有任何更改。那么我必须在哪里进行更改才能删除此异常?使用您的方法接受treeview作为参数,然后你可以把它从你的UI层传过来如果你不介意的话,你可以提供一行语法怎么做谢谢你,非常感谢我编辑的代码部分,我的代码部分与你的代码部分相匹配,但是很抱歉,例外情况仍然存在,我正在编辑我在问题中提出的代码部分,请看一看,告诉我,我错在哪里??请原谅再次打扰您,调用treeView1=new TreeView()正在破坏引用。此外,您不需要在类中使用私有树视图,因为您应该在表单上传递树视图。您的表单上确实有一个名为treeview W1的treeview?那么我必须在哪里进行更改才能删除此异常?使用您的方法接受treeview作为参数,然后您可以从UI层传入它。如果您不介意,您可以提供一行语法如何做..谢谢,非常感谢代码部分,我编辑了我的代码部分以匹配您的代码部分,但很抱歉,例外情况仍然存在,我正在编辑我在