【问题标题】:How to pass string parameter of a method from one class to another class in same namespace?如何将方法的字符串参数从一个类传递到同一命名空间中的另一个类?
【发布时间】:2009-03-03 12:46:17
【问题描述】:

有点傻的问题,但是卡了很长时间。 我编写了两个类,一个是 Form(TreeDisplay 类),另一个包含业务逻辑(MyTreeNode 类)。 TreeDisplay 类包含用于选择文件的浏览按钮,并将其传递给 MyTreeNode 类中的方法 initiatingTree(string 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() 时,代码从这一行出来并进入抛出 NullReferenceException 的 catch 块。

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

【问题讨论】:

    标签: c# winforms class


    【解决方案1】:

    你的断点处 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); 
    }
    

    【讨论】:

    • 那么我必须在哪里进行更改才能删除此异常?
    • 改变你的方法来接受树视图作为参数,然后你可以从你的 UI 层传入它
    • 如果你不介意你能提供一行语法如何做到这一点..谢谢
    • 嗨 ck,非常感谢我编辑了我的部分代码以匹配你的部分代码,但很抱歉异常仍然存在,我正在编辑我放入的部分代码我的问题只是看看并告诉我,我哪里出错了?打扰你又来一次了……
    • 调用 treeView1 = new TreeView() 正在破坏引用。此外,您的班级中不需要私有 TreeView,因为您应该传入表单上的树视图。您的表单上有一个名为 treeView1 的树视图吗?
    【解决方案2】:

    正如 c.k 所说。

    作为标准,您无权从业务层访问用户控件。 为了简单起见,我建议您将控制代码保留在后面的 gui 代码中。

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

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

    【讨论】:

    • 对不起,我没明白你的意思……我是 C# 新手,所以对此一无所知……我不知道该放什么??谢谢..
    【解决方案3】:

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

    【讨论】:

    • 我也这样做了,但没有任何改变。
    【解决方案4】:

    我猜你是复制粘贴的吧?

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

    private System.Windows.Forms.TreeView treeView1;
    

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

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

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

    【讨论】:

    • 您好,感谢您消除疑虑。你是对的,我将它粘贴在 MytreeNode 类上。但是我尝试了上面的语法,仍然得到相同的异常,你能告诉我这行代码到底应该放在哪里吗?
    • 实际上它取决于,我的意思是,你是只在这个函数中使用这个对象,还是你想在类级别上使用它。无论如何,将这行代码放在使用对象之前的任何位置,在此行 treeView1.Nodes.Clear(); 之前的任何位置。推荐:在函数或构造函数的开头
    • 我想在类级别上使用它。我在 treeView1.Nodes.Clear() 上面写了这一行,仍然得到相同的异常。尝试创建构造函数并传递参数 treeview 并使用了这一行在构造函数内部仍然存在异常。我还能尝试删除此异常吗?Tanx
    猜你喜欢
    • 2015-10-10
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多