2009-05-06 7 views
2

アプリケーション内のどこからでも新しいテキスト行を受け取るwinformsアプリケーションでテキストボックスを作成するにはどうすればよいですか?アプリケーション内の任意の場所からテキストボックスにアクセスします

私はテキストボックスを含むメインフォームを持っています。私は直接別のクラスのメソッドからボックスにテキストを追加したいと思います。

更新

私は私のメインフォームでこれを試してみました:

public void Output(String value) 
    { 
     if (txtOutput.Text.Length > 0) 
     { 
      txtOutput.AppendText(Environment.NewLine); 
     } 
     txtOutput.AppendText(value); 
    } 

しかし、私は他のクラスからの出力を呼び出すことはできません。私はC#の初心者なので、おそらく私は何か明白なものを見逃しています。

よろしくお願いします。

PSはい、私はこれが悪いデザインであることを知っていますが、今のところ、これは私がしたいことをするための最良の方法だと思われます。テキストボックスはコンソールのように機能します。

答えて

4

フォームのstringプロパティとしてプロパティのTextBoxを公開する必要があります。たとえば...編集

public string TextBoxText 
{ 
    get { return textBoxName.Text; } 
    set { textBoxName.Text = value; } 
} 

質問の編集を読んだ後、あなたの問題は、あなたがそのコードを実行しようとしているwhereeverフォームの特定のインスタンスへの参照が必要だということです。参照(これはより良いオプションです)を渡すか、いくつかのコードを使用して、フォームの1つのインスタンスを参照する静的プロパティを持つことができます。以下のような何か...

このアプローチを使用
public partial class MyForm : Form 
{ 
    private static MyForm instance; 

    public static MyForm Instance 
    { 
     get { return instance; } 
    } 

    public MyForm() : base() 
    { 
     InitializeComponent(); 

     // .... 

     instance = this; 
    } 
} 

、あなたのデザインが少し壊れているように見えますMyForm.Instance.Output("test");

+0

OPからLinesを追加したいという質問から、一度に1つ。だから私はそれがマルチラインだと思っています。 –

+0

@Henk:そして...?あなたが何を得ているのか分かりません。 –

+0

これはsmellyコードは異論ではありません... – Miel

0

を呼び出すことができます。あなたは、GUIコントロールでビジネスロジックを混乱させるべきではありません。戻り値を試して、それをインターフェイス側に割り当てるのはなぜですか?もう少しあなたがコントロールを少し逆でき切り離すために

+0

ビジネスロジックが更新を行っていると誰が言いましたか?なぜそれが別のUIコントロールではないのですか? –

+0

「アプリケーションのどこにいても」ということは、それがビジネスロジックでもあることを意味します。 – Migol

1

// interface for exposing append method 
public interface IAppend 
{ 
    void AppendText(string text); 
} 

// some class that can use the IAppend interface 
public class SomeOtherClass 
{ 
    private IAppend _appendTarget = null; 

    public SomeOtherClass(IAppend appendTarget) 
    { 
     _appendTarget = appendTarget; 
    } 

    private void AppendText(string text) 
    { 
     if (_appendTarget != null) 
     { 
      _appendTarget.AppendText(text); 
     } 
    } 

    public void MethodThatWillWantToAppendText() 
    { 
     // do some stuff 
     this.AppendText("I will add this."); 
    } 

} 

// implementation of IAppend in the form 
void IAppend.AppendText(string text) 
{ 
    textBox1.AppendText(text); 
} 
+0

エンジニアリングされたと思われる –

+0

@Adam;そうかもしれない。実際には問題のアプリケーションの複雑さに依存します。それは1つのフォーム、クラスのアプリケーションのhandfull、または複数のアセンブリ、アプリのクラスの種類の負荷ですか?最初のケースでは、これは過度に設計されていることがわかります。後者では、それが適していることがわかります。 –

+0

@Fredrikもちろん、それは意見の問題ですが、後者の場合、同じインタフェースに複数のインスタンスを渡すのではなく、より集中的なシングルトン/スタティックなLoggerのアプローチを取る方が適切なようです。 YMMV。 –

0

これはそれを行うための本当に悪い方法ですが、ちょうどすべての答えがそこにいることを確認するために...

VSデザイナーでは、各フォームコントロールには、プロパティウィンドウにModifiersという名前の項目があり、デフォルトはPrivateです。これをInternalPublicなどの他の設定に変更すると、フォームの外からアクセスできます。

これは最悪の方法です。

+0

...それはなぜ示唆すべきではありません。また、フォームにグローバル文字列変数とタイマーをポーリングする方法で実装することもできます。それが示唆する価値があるというわけではありません... –