2012-04-30 8 views
0

C#で基本フォームアプリケーションを使用する場合、その中の変数にアクセスする際に問題があります。だから、フォーム変数にアクセスする

フォームクラスで、私は

public partial class pingerform : Form 
{ 
    .. 
    .. 

    private System.Windows.Forms.TextBox textBox2; 

    public string textBox2Text 
    { 
     get { return textBox2.Text; } 
     set { textBox2.Text = value; } 
    } 

を持っているし、メインアプリケーションでは、私は

Application.Run(new pingerform()); 
... 
... 

pingerform.textBox2Text.text() = str; 

を持っていますが、私は何のオブジェクト参照が存在しないことを聞いていますと。

エラー1オブジェクト参照が非静的フィールド、 メソッド、またはプロパティのために必要とされる
'pingerform.textBox2Text.get' C:\ Users \ユーザーaaron.streetのVisual Studioの 11 \ドキュメント\ \ Projects \ PingDrop \ PingDrop \ Program.cs 54 21 PingDrop

だから、私はピンガーフォームクラスを静的にすると思ったが、これをやらせてもらえませんでしたか?

エラー1
静的クラスのインスタンスを作成できません 'PingDrop.pingerform' C:\ Users \ユーザーaaron.streetドキュメントは、Visual Studioを\ \ 11の\プロジェクト\ PingDrop \ PingDrop \ Program.csの21私はフォームの特定のインスタンスを作成してフォームのプロパティにアクセスするにはどうすればよい29 PingDrop

私は定期的に形にして提出されたテキストを更新したいことを実行しているバックグラウンドスレッドを持っています?あなたは、そのインスタンスを作成せずにインスタンスのプロパティにアクセスすることができない

乾杯

アーロン

答えて

0

あなたは新しいインスタンスを作成し、いずれかのスレッドにパラメータとして渡すか、メインプログラムのクラスのメンバーとして保存するしかありません。

番目のオプションの例:

private static pingerform myPingerform = null; 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    myPingerform = new pingerform(); 
    Thread thread = new Thread(new ThreadStart(UpdateTextBox)); 
    thread.Start(); 
    Application.Run(myPingerform); 
} 

private static void UpdateTextBox() 
{ 
    while (true) 
    { 
     myPingerform.textBox2.Text = DateTime.Now.Ticks.ToString(); 
     Thread.Sleep(1000); 
    } 
} 

そしてpublicするテキストボックスを変更することを忘れないでください。

注::これは、テキストボックスにアクセスする1つのバックグラウンドスレッドの単純なケースに対する簡単な解決策です。スレッドにアクセスしているスレッドがさらに多い場合はこれはを破棄します。もう少し作業を必要とするベストプラクティスの方法については、read thisをご覧ください。

+0

これはひどく壊れます。 – wRAR

+0

これは、フォームの明示的なインスタンスを作成するためのベストプラクティスと見なされますか。 Visual Studioでテンプレートを作成するときにメソッドを使用するのはなぜですか? – DevilWAH

+0

@DevilWAHそれは可能な唯一の練習(VBまたは他の狂気を除いて) – wRAR

0

、それはナンセンス(又は同じであるVB)です。そして、あなたはすでにApplication.Run()に渡されたインスタンスを作成しました。とにかく、Application.Run()の後でフォームを使って何もできないのは、アプリケーションが終了したときだけ返るからです。フォームで何かしたいのであれば、他の場所でそれを行う必要があります。もちろんインスタンスを作成する必要があるため、フォームクラスを静的にすることはできません。

フォームを別のスレッドで実行する必要がある場合は、作成時にフォームインスタンスをスレッドに渡す必要があります。 GUI以外のスレッドからのGUI要素を直接混乱させるのは悪い考えですが、Control.BeginInvoke()を使うべきです。

-1

これを試してください:

pingerform myForm = new pingerform();  
Application.Run(myForm); 
myForm.textBox2Text = "this is text"; 
+0

'Run()'メソッドがブロックしています。 –

+0

しかし、私はこのフォームのインスタンスを作成する必要があります。また、フォームを更新するプロセスが別のスレッドで実行されているため、ブロックされますか? 「Run」を使用することは、進歩の道筋です。しかし、ちょうど@ – DevilWAH

+0

@DevilWAHあなたのアプリケーションを実行するためにあなたはそれが基本的な 'Run()'を使用する必要があります疑問に思う。 –

関連する問題