2009-04-08 5 views
3

私は現在Visual Studio 2008を使用しているC#の小さなウィンドウフォームプロジェクトで作業しています。 プロジェクトにカスタムクラスを追加しましたが、このクラスではフォームにアクセスできませんプログラムのプロパティを変更するために、コントロール(リストボックス、テキストボックス、ボタンなど)クラスのWinformsコントロールにアクセスできません

クラスファイルにはsystem.windows.formsが含まれており、すべてのファイルは同じ名前空間にあります。 驚いたことに、クラスでメソッドを作成してからintellisenseがさまざまなコントロールの名前をポップアップしない限り、form1クラス自体のコントロールにもアクセスできません。

ただし、intellisenseはコントロールの名前をまったく表示しません。

誰かがなぜこのようなことが起こっているのかを明らかにしてくださったことを感謝します。

おかげ

+0

関数を作成しない限り、Form1クラス自体のコントロールにアクセスできないということを意味しますか?関数にない場合は、そのコードをどこに置いていますか? –

答えて

4

カプセル化は、あなたの別のクラスはコントロールに直接話をしてはならないことを意味します。もし、代わりに、あなたの(外側)のプロパティおよびメソッドを公開する必要がありControl - 例えば:より複雑な操作について

public string TitleText { 
    get {return titleLbl.Text;} 
    set {titleLbl.Text = value;} 
} 

その方法を使用することが好ましいです。慎重な値の簡単な読み取り/書き込みのプロパティは問題ありません。

これは、様々な利点を提供します。

  • することができますインターフェイス(または類似)に、必要に応じて、抽象詳細
  • あなたはタイトルのためにフォームのテキストを使用して、例えば(実装を変更することができます)呼び出し元のコード
  • を変更することなく、それだけで...よりよい;-p
+0

ここでの問題は、彼がフォームへの参照を持っていないということです。その場合、プロパティを追加することは役に立ちません。それとは別に、私はコントロールを公開として公開しないことについて全く同意する –

3

あなたのクラスでは、これが機能するためのフォームへの参照を必要としています。これは、フォームが静的なクラスではないため、複数のインスタンスを持つことができるためです。

リファレンスを与える最良の方法は、おそらくクラスコンストラクタに渡すことです。次に、クラスはフォームへの参照を持ち、その参照を使用してコントロールを変更できます。

フォームのインスタンスを1つだけ開くことを100%確信している場合に使用できる代替オプションは、フォームのインスタンスを返すフォームクラスにパブリック静的プロパティを追加することです。そのプロパティは、他のクラスで使用できるようになります。

また、コントロールがパブリックであることを確認するか、間接的にコントロールを操作するために使用できるパブリックメソッドをフォームに追加することをお勧めします。 Form1の中

3

コントロールが

partial class Form1 
{ 
    //elided other good stuff 
    private System.Windows.Forms.Button button1; 
} 

はありませんので、あなたは別のクラスから直接アクセスすることはできませんプライベートになります。

@abatishchevが示唆しているように公開することができます(ただし、それは本当に悪い考えです)。 より良い計画は、@Marc Gravellが提案するようにプロパティを使用することです。 あなたは依然としてプロパティを消費したいクラスにフォームへの参照を渡す必要があります(@Rune Grimstadによって指摘されているように)。 UIにデータを直接要求するクラスをアプリケーションに書き込もうとしています。これは通常、とても良いアイデアとは考えられていません。クラスはそれ自身の目的に完全に関係しているべきです。クラスがアクセスする必要があるデータの特定のビットのプロパティやイベントを設計する必要があります。フォーム全体を渡す必要はありません。多分、作業や変更が必要な値だけでしょう。

0

これはMVPパターン(サンプルコード)を使用して実装することができる方法を見てみましょう:Implementing MVC with Windows Forms

UPDATE:あなたが言及したクラスのコードが実際に参照を持っているフォームのプレゼンター、の一部である必要がありますが(IViewインタフェースを介して)フォームに渡します。これは、他のフォームのプライベートな部分に直接アクセスするのではなく、UIコードを設計する方法です。