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

时间:2009-03-03 12:46:17

标签: c# winforms class

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

这是TreeDisplay类(我的主要表单)的浏览按钮中的代码:

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

以下是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()时,代码从此行发出并进入catch块抛出NullReferenceException。

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

4 个答案:

答案 0 :(得分:5)

断点处treeView1的值是多少?

我建议这可能为空,因为您的业务逻辑层中没有该引用。


更新了示例代码:

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); 
}

答案 1 :(得分:1)

正如c.k所说。

您无法从业务层访问用户控件作为标准。 我建议你为了简单起见,让你在gui代码中控制代码。

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

(Gui Layer)用于控制交互的Codebehind
用于数据处理的业务层
用于数据库操作的数据层等

答案 2 :(得分:0)

在访问之前初始化treeView1对象。

答案 3 :(得分:0)

我猜你复制并粘贴了,对吧?

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

private System.Windows.Forms.TreeView treeView1;

这只是声明一个System.Windows.Forms.TreeView类型的变量,这个变量(本身)存储在堆栈中,因为它只是一个引用,一个直到现在才指向任何实际堆对象的引用(即NullReference)。现在这个引用是没用的,你不能使用它,除非你初始化它并告诉它指向堆上的真实对象,这就是VS在设计器中为你做的,它只是将下一行添加到InitializComponents:< / p>

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

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