2012-03-16 7 views
1

からアクセスするツリービューコントロールは、Visual Studio 2010C# - 私はWindows上で働いている他のクラス

  • フォームmainFormがあるとC#でフォームアプリケーション。
  • mainFormには、ツリービューコントロールxmlTreeViewが含まれています。
  • 自分で書かれたクラスmyClass.csがあります。

ここで、myClassxmlTreeViewにアクセスする必要があります。しかし、私はa)フォームにアクセスする方法とb)それを行うのが最善の方法を知らない。

私はoleksii's answerのインターフェイスを実装しようとしましたが、私はそれを取得しません。

public interface IMainForm { 
    TreeView treeView { get; } 
} 

public partial class mainForm : Form, IMainForm { 

    public TreeView treeViewControl { 
    get { return myTreeViewControl; } 
    } 

    // Some code here 
    [...] 

    RuleTree rt = new RuleTree(); //How do I call this with the IMainForm interface??? 
} 

別のクラスRuleTreeはこのように定義されています:私はIMainFormでRuleTreeのコンストラクタを呼び出すにはどうすればよい

class RuleTree { 
    private readonly IMainForm mainForm; 
    public RuleTree(IMainForm mainForm) { 
    this.mainForm = mainForm; 
    } 

}

アプリケーションのメインフォームは、このように定義されインタフェース???その後、彼らのCSクラスなど test.aspxはあなただけtest.aspx.cs その他、このクラスではテストページのコントロールにアクセスすることができます ページがあり、このことはできません

答えて

2

私は以下を行います。それをコードとして見ることはできません。あなたが理解できるように、適切に修正することができます。

public class MyClass 
{ 
    public void MyMethod(YourTreeViewControl treeview) 
    { 
      // Do what you need to do here 
    } 
} 

その後の後ろにフォームのコードでただのMyClassのインスタンスを作成し、それをあなたのツリービューのインスタンスを渡し、このような何か:

MyClass myClass = new MyClass(); 
myClass.MyMethod(tvYourTreeViewControl); 

希望これは理にかなって:)私が持っている

+0

はい、それは私もこれを念頭に置いているように意味があります。私はこれを試み、オレクシスの答えを与えるでしょう。私のニーズに適したものがどれか分かります:-) –

-2

これは、他の他のクラスにasp.netのサーバー側のコントロールにアクセスすることはできません。

+1

これはASPアプリケーションではなくWindowsフォームです。 –

+0

これはASP.NETの質問ではないので、あなたの答えは関連していません。 –

+0

@BrendanVogtあなたはいいですか? windowsフォームもasp.netアプリケーションです。 asp。ネットはただの技術なのです。 –

1

ここでは、依存性注入を使用する方法が考えられます。 MyClassは、Formパラメータを取るコンストラクタを持ちます。したがって、MyClassを作成すると、の形で埋め込まれます。たとえば:

Foo 
{ 
    Foo(){} 
} 

Bar 
{ 
    private Foo currentFoo; 

    Bar(Foo foo) //dependency injection 
    { 
     currentFoo = foo; 
    } 

    public void OtherMethod() 
    { 
     //do something with currentFoo 
    } 
} 

インターフェース(または抽象クラス)を使用する方がよいでしょう、そう代わりFooのあなたがIFooを注入でき、これは主に良いデザインの決定である、あなたのクラスを分離します。

+0

私はインターフェイスを実装することでこれを試してみたいと思いますが、何とか私は立ち往生しました。それは私がブレンダンの答えを選んだのです:-) –

0

私のコードをコメントを読んでコメントした、私も解決策を利用できるようにすることができます。

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 

    namespace WindowsFormsApplication1 
    { 
     static class Program 
     { 


    /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     /// 

     //Declare a static form that will accesible trhought the appication 
     //create form called frmMain form or any other name 
     // 
     public static frmMain MainForm { get; private set; } 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      //comment out default application run 
      //Application.Run(new MainForm()); 

      //create a new instance of your frmMain form 
      //inside your main form add a tree view 
      //Loacte this file "frmMain.Designer.cs" 
      //Change treeView1 from private to public 
      // public System.Windows.Forms.TreeView treeView1; 
      MainForm = new frmMain(); 

      //before I show my form I'll change docking of my tree view from myClass 
      MyClass mine = new MyClass(); //done 

      MainForm.ShowDialog(); 

     } 


    } 

    public class MyClass 
    {   
     public MyClass() 
     { 
      Program.MainForm.treeView1.Dock = DockStyle.Fill; 
     } 

    } 
} 
関連する問題