2012-02-18 10 views
1

テキストボックスを 'hex'というクラスからメインフォームに更新しようとしています。クラスの六角「私は、次のコードを持っている内:以下に示すように、コードが「updateTextBox」と呼ばれる方法をメインフォームに変数を渡す 別のクラスからテキストボックスを更新する

 Main m = new Main(); 
     m.updateTextBox(convertedHex); 

:これはと思われる場合

public void updateLog(string input) 
    { 
     textBox2.AppendText(input); 
    } 

申し訳ありません愚かな質問のように私はしばらく詰まっている、私のGoogle検索のすべてのリンクは今紫色になるので、誰かが私にこれを説明することができれば願っていた。どうもありがとう。

+0

スタートアップフォームとは何ですか? Mainの場合は、Mainの新しいインスタンスを作成しており、UIは更新されません。 –

答えて

3

textBoxが作成されているMainクラスの内部にこの種のメソッドを追加し、外部から呼び出します。どこでもこれはまた、あなたがからの更新を呼び出すことができますMainLogWindowオープン

持っていると仮定してからProgram.MainLogWindow.UpdateTextBox("test test");

は、あなたがそれが好きで新しい

// Add this code in Program.cs (or similar where you start the gui 
    public static readonly Main MainLogWindow = new Main(); 

    // Add this code in Main.cs class 
    private delegate void NameCallBack(string varText); 
    public void UpdateTextBox(string input) { 
     if (InvokeRequired) { 
      textBox.BeginInvoke(new NameCallBack(UpdateTextBox), new object[] {input}); 
     } else { 
      textBox.Text = input; 
      // textBox.Text = textBox.Text + Environment.NewLine + input // This might work as append in next line but haven't tested so not sure 
     } 
    } 

コールを開始するには、あなたのProgram.csクラスにコードを追加しましたとしましょう他のスレッド内。

+0

お返事ありがとう!私は 「それは 『メソッドグループ』であるため、エラーが発生しました 『のappendText』に割り当てることができません」このエラーが出る あなたは、私が 名前空間WindowsPrefetchSearch { 公共部分クラスにコードをコピーし、私が間違ってやっている知っていますかメイン:フォーム { string root = System.IO.Path.GetPathRoot(Environment.SystemDirectory); public Main() { InitializeComponent(); } //ここにコードを入れて、多くの感謝! – James

+0

AppendTextを.Textに変更し、それが動作するかどうか教えてください。私はAppendTextがあなたのために働くものだと思った。私はそれを確かめるためにソースを編集した。それがうまくいくならば、 'textBox.Text = textBox.Text + input'のように使って、あなたがしたいAppendTextをシミュレートすることができます。 – MadBoy

+0

.Textは動作しているようですが、現在のコンテキストに存在しないため、何らかの理由で別のクラスから呼び出すことはできません。ご協力ありがとうございます! – James

0

あなたのクラス(おそらくビジネスオブジェクト)は、通常、UIの更新には関係しません。特にあなたはでも UIを持っていることを知る必要はありません。しかし、いくつかの便利なアプローチがあります。

1)ビジネスオブジェクトのメソッドを呼び出すだけで、メソッドが値を返すようにしてから、UIで表示するように選択できます。

// inside Main form 
var hex = new Hex(); 
string convertedHex = hex.GetConvertedHex(someArgument); 
UpdateTextBox(convertedHex); 

2)ビジネスオブジェクトでイベントを公開してください。イベントの引数には、イベントを購読するすべての人にブロードキャストする必要のある文字列が含まれます。 UIは加入者の1人になります。

2つのアイデアのうち、実際にイベントモデルが必要ない限り、私は一般的に最初のものを選ぶでしょう。

1

あなたには非常に多くの情報を提供していません。しかし、あなたのスタートアップフォームがMainであると私のコメントで言ったように、あなたが表示しているコードは新しいMainフォームを作成しており、それに対する変更はあなたのUIには表示されません。フォームインスタンスをHexクラスのコンストラクタに渡す必要があります。私はこのようなものだろう(名前空間が同じであると仮定して、彼らは同じスレッド上にあり、あなたの六角クラスは静的ではありませんが。あなたはMadBoyで示した方法を使用する必要が異なるスレッド上の場合)

public partial class Form1 : Form 
{ 
    Hex hex; 
    public Form1() 
    { 
     InitializeComponent(); 
     hex = new Hex(this); 
    } 
} 


class Hex 
{ 
    Form1 m; 

    public Hex(Form1 frm) 
    { 
     m = frm; 
     m.updateTextBox("Hello World"); 
    } 
} 
+0

多くのおかげで、私はMadBoysメソッドを使用しました。あなたに助けてくれてありがとう:) – James

0
をシンプル

冗談性質から、このメイクテキストボックスの公共のすべてを行うと、この

のようにそれをCALできるクラスで、今この

public void mthod(){ 

//crete a obj of the class 

cls1 obj=new clas1(); 

obj.smethod(this); 

} 

のような方法throudhクラスに現在のフォームオブジェクトを渡す必要はありません

smethod(from1 obj){ 
obj.textbox.text=""; 
} 
関連する問題