0

数日前に、クラスのフォームにリストボックスを設定することについて質問しました。それはうまくいき、素晴らしかったです!ただし、テキストボックスまたはラベルでも同じことをしたいと思います。その質問からの答えは以下の通りです:

あなたがしているのは、フォームの新しいインスタンスを作成することです-既存のフォームのリストボックスにアイテムを追加しようとしていると思いますか?

もしそうなら、これを行います。

次のようなリストボックスを使用して、フォームに関数を作成します。

    public void addItemToListBox(string item)
    {
         listBox1.Items.Add(item);
    }

次に、クラスで(using System.Windows.Forms参照を追加することを忘れないでください)

   public void doStuff()
    {
 //Change Form1 to whatever your form is called
 foreach (Form frm in Application.OpenForms)
 {
      if (frm.GetType() == typeof(Form1))
      {
           Form1 frmTemp = (Form1)frm;
           frmTemp.addItemToListBox("blah");

      }
 }
    }

これはうまく機能します。今、私はテキストボックスで同じことをしたいと思います。誰かが説明できるのか、誰かがこれに関するリンクを持っているのか疑問に思いましたか?

フォームとクラスがあります。フォームはクラスの新しいインスタンスを作成し、クラス内のメソッドを開始します。たとえば、数学の方程式4+4です。クラスのメソッドから、フォーム1のテキストボックスまたはラベルに「8」という答えを表示したいと思います。

4

4 に答える 4

2

これをForm1.csに入れます。

public void SetText(string text)
{
    textBox1.Text = text;
}

そしてクラスファイルで:

frmTemp.SetText("XYZ");
于 2012-11-08T20:10:14.340 に答える
2

編集で説明しているのは、別のクラスForm を使用するモデルです。使用されているクラスは、、Formそのコントロール、またはその計算結果がどのように使用される可能性があるかについての知識を持っていない必要があります。

他のクラスはフォームを見つけたり、フォームのメソッドやフィールドなどを呼び出したりしないでください。何をすべきかは、値を返すだけです。

public class OtherClass
{
    public int Add(int first, int second)
    {
        return first + second;
    }
}

次に、フォームは次のようなことを行うことができます。

private void button1_Click(object sender, EventArgs e)
{
    //create an instance of the other class
    OtherClass other = new OtherClass();
    //call it's add method, and then use the result to set the textbox's text
    textbox1.Text = other.Add(4, 4).ToString(); 
}

他のクラスは、計算の実行、結果の作成を担当する必要がありますが、それらの結果に基づいてユーザーインターフェイスを更新することはできません。すべてのユーザーインターフェイスロジックがFormクラスに含まれている必要があります。

于 2012-11-08T20:35:47.793 に答える
1

開いているすべてのフォームをループすることは、問題のフォームを取得するための...斬新な...方法のようです。

代わりに、最終的にフォームを閉じるまでフォームへの参照を保持し、フォームの変数(リストボックスやテキストボックスなど)に直接アクセスする必要があります。

したがって、フォームを作成する場所で、次のようなことを行います

Form1 form1 = new Form1();

//ダイアログまたはform1で行うことを開きます

//テキストコントロールにアクセスする必要がある場合:

form1.textBox1.Text = "Some value"; // Assumes the control is called textBox1

doStuffがモデル(実際の動作のある側面をモデル化するクラス)から発生している場合は、不十分なデザインパターンに従っています。

モデルは、それらがどのように提示されるかを知らないはずです。代わりに、一般的なWinFormsアプリケーションでは、親フォームが変数form1を保持している可能性があります。新しいタイプのUIプロジェクトでは、モデル、ビュー(プレゼンテーション/フォーム)、およびコントローラー(フロー制御)を分離するためのMVCまたはMVVMパターンが表示されます。WinFormsでMVCパターンに従うこともできますが、私が見た多くの/ほとんどのWinFormsアプリケーションはそれを行いません。

于 2012-11-08T20:10:45.757 に答える
0

Visual Studioを使用している場合は、privateまたはなど、各メンバーの表示を指定できますpublicprivateデフォルトです(私が正しく覚えている場合)。

これをに変更するとpublic、次のようになります。

public void doStuff()
{
 //Change Form1 to whatever your form is called
 foreach (Form frm in Application.OpenForms)
 {
  if (frm is Form1)
  {
       var frmTemp = (Form1)frm;
       frmTemp.listBox1.Items.Add("blah");
       frmTemp.textBox1.Text += "hello world";
  }
 }
}

編集1
より良いアプローチは、Form1に何かを更新する必要があることを伝えることです。データをどのように表示するかは、メソッドを呼び出すクラスには関係ありません。

private Form1 _FindForm()
{
   //assuming you can use Linq
   return Application.OpenForms.OfType<Form1>().Single();
}

public void displaySomething()
{
   var form = _FindForm();
   form.displaySomething();
}

public class Form1
{
  public void displaySomething()
  {
    //add an item to the list box
    listBox1.Items.Add("foo");

    //and change the text somewhere
    textBox1.Text += "bar";
  }
}

Form1は、他の(おそらく)無関係のクラスがそれらを操作するのではなく、保持するコントロールを変更する責任があります。これにより、すべてのUIロジックencapsulatedがForm1に保持され、すべてのビジネスロジックを他の場所に保持できます。

于 2012-11-08T20:12:30.410 に答える