小傻问题,但长时间陷入困境。
我写了两个类,一个是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。
请帮助查找异常的根本原因。感谢。
答案 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。我想这是你的问题,或者至少这是我能理解的。如果我不理解你,请原谅我!