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\Documents\Visual Studio 11\Projects\PingDrop\PingDrop\Program.cs 54 21 ピンドロップ

だから私はpingerフォームクラスを静的にしようと思ったのですが、これはできませんか?

エラー 1
静的クラス 'PingDrop.pingerform' C:\Users\aaron.street\Documents\Visual Studio 11\Projects\PingDrop\PingDrop\Program.cs 21 29 PingDrop のインスタンスを作成できません

フォームの特定のインスタンスを作成せずにフォームのプロパティにアクセスするにはどうすればよいですか?

フォームに入力されたテキストを定期的に更新したいバックグラウンド スレッドを実行していますか?

乾杯

アーロン

4

3 に答える 3

0

新しいインスタンスを作成し、それをパラメーターとしてスレッドに渡すか、メインの Program クラスのメンバーとして格納するしかありません。

2 番目のオプションの例:

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 つのバックグラウンド スレッドがテキスト ボックスにアクセスするという単純なケースに対する単純な作業ソリューションです。より多くのスレッドがアクセスしている場合、これは壊れます。さらに作業が必要なベスト プラクティスの方法については、こちらをお読みください。

于 2012-04-30T10:55:04.657 に答える
0

そのインスタンスを作成せずにインスタンスのプロパティにアクセスすることはできません。それはナンセンスです (または同じ VB)。そして、 に渡したインスタンスをすでに作成していますApplication.Run()Application.Run()とにかく、フォームはアプリが終了したときにのみ返されるため、後でフォームを操作することはできません。フォームで何かをしたい場合は、他の場所でそれを行う必要があります。もちろん、インスタンスを作成する必要があるため、フォーム クラスを静的にすることはできません。

別のスレッドのフォームで何かを行う必要がある場合は、作成時にフォーム インスタンスをスレッドに渡す必要があります。ただし、GUI 以外のスレッドから GUI 要素を直接いじるのは悪い考えであることに注意してください。使用する必要がありますControl.BeginInvoke()

于 2012-04-30T10:46:29.483 に答える
-1

これを試してください:

pingerform myForm = new pingerform();    
Application.Run(myForm);
myForm.textBox2Text = "this is text";
于 2012-04-30T10:47:18.967 に答える