2009-03-03 5 views
0

少しばかげた質問ですが、長い間立ち往生しています。 Form(TreeDisplayクラス)とbuisenessロジック(MyTreeNodeクラス)を含むクラスの2つのクラスを作成しました。 TreeDisplayクラスには、ファイルを選択するブラウズボタンが含まれています。initiatingTree(文字列ファイル名) MyTreeNodeクラスにあります。
この文字列パラメータのファイル名を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); 
     } 

はinitiatingTree(のコードである)私のMyTreeNodeクラスで:ブレークポイントを使用してオン

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ブロックに入ります。

例外の根本原因を見つけるお手伝いをしてください。ありがとう。

答えて

5

あなたのブレークポイントでのtreeView1の値は何ですか?

ビジネスロジックレイヤーで参照が利用できないため、これはnullである可能性があります。

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

のための制御の相互作用
ビジネスレイヤのためにあなたのコード

(グイ・レイヤー)分離コードをソートする方法の例ので、私は確認する必要がありますこの例外を削除するための変更? –

+0

あなたのメソッドがパラメータとしてツリービューを受け入れるようにしたら、あなたのUIレイヤーから渡すことができます – cjk

+0

もしあなたが気にしないなら、それを行うための1行の構文を与えることができます..ありがとう –

0

はそれにアクセスする前にのTreeView1オブジェクトを初期化します。

+0

私もそれをしましたが、何も変わりませんでした。 –

0

あなたはコピーして貼り付けたようですね。

とにかくここで少し注意してください: VS Designerのフォームでコントロールをドラッグすると、vsはこれらのコントロールのコードを "通常InitializeComponent()"に生成します。 VSは次のように(例えばForm1.csの)あなたのクラスで参照を書き込みます

private System.Windows.Forms.TreeView treeView1; 

これはちょうどこの変数(自体)がスタック上に保存されているSystem.Windows.Forms.TreeView型の変数を宣言して、それはちょうど参考文献なので、実際のヒープオブジェクトを現在まで指していない参照(つまりNullReference)です。このリファレンスは役に立ちません。初期化してヒープ上の実際のオブジェクトを指すように指示しない限り、VSをデザイナーで使用すると、InitializComponentsに次の行が追加されます。

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

これは、他のクラスにコピーすることを忘れた行です。これは、リファレンスが初期化されていない状態(i。eはまだNullReferenceです)、それを使用しようとすると、NullReferenceExceptionがスローされました。私はこれがあなたの問題か、少なくともこれが私がそれを理解する方法であると思います。もし私があなたを理解できなかったら、私を許してください!

+0

こんにちは、 疑いをクリアしていただきありがとうございます。 あなたは私がMytreeNode class.Butにペーストしたのですが、私は上記の構文を試しても同じxceptionを得ることができますplzは正確に私はこのコード行を置く必要がありますか? –

+0

実際はそれはこの関数内でのみこのオブジェクトを使用するか、クラスレベルで使用するかどうかによって異なります。とにかくオブジェクトを使用する前に、この行をtreeView1.Nodes.Clear();の前に置いてください。推奨:関数またはコンストラクタの最初に – Galilyou

+0

私はクラスレベルでそれを使用したい.iは、treeView1.Nodes.Clear()の上にこの行を書きましたが、コンストラクタを作成するために同じexception.itriedを取得し、パラメータtreeviewを渡しました&コンストラクタ内でこの行を使用しても例外が残っています。他に何かこの例外を取り除こうとすることができますか?Tanx –

1

c.kと述べた。

ビジネス層のusercontrolsを標準としてアクセスする権限がありません。 簡単にするために、コードをGUIコードの中に入れておくことをお勧めします。

データ操作
データのデータベース操作のためのレイヤと、このような

+0

私はあなたがこれを意味するものを得ることはできません。 私はC#これについて... 私は正確に何を置くべきか分からないのですか? ありがとう.. –

関連する問題