web-dev-qa-db-ja.com

別のクラスからWinformテキストボックスコントロールにアクセスする方法は?

winformと呼ばれるForm1textboxと呼ばれるtextBox1

Form1では、次のように入力してテキストを設定できます。

textBox1.text = "change text";

今、私は別のクラスを作成しました。このクラスでtextBox1を呼び出すにはどうすればよいですか?したがって、このクラスのtextBox1のテキストを変更します。

この新しいクラスからForm1にアクセスするにはどうすればよいですか?

33
Psychocryo

しないことをお勧めします。フォームでのテキスト編集の実装方法に依存するクラスが本当に必要ですか、それともテキストを取得および設定できるメカニズムが必要ですか?

後者をお勧めします。したがって、フォームで、問題のTextコントロールのTextBoxプロパティをラップするプロパティを作成します。

public string FirstName
{
    get { return firstNameTextBox.Text; }
    set { firstNameTextBox.Text = value; }
}

次に、クラスへの参照を取得できるメカニズムを作成します(たとえば、コンストラクターを介して)。次に、そのクラスはプロパティを使用してテキストにアクセスし、変更できます。

class SomeClass
{
    private readonly YourFormClass form;
    public SomeClass(YourFormClass form)
    {
        this.form = form;
    }

    private void SomeMethodDoingStuffWithText()
    {
        string firstName = form.FirstName;
        form.FirstName = "some name";
    }
}

さらに良い解決策は、インターフェイスで可能な相互作用を定義し、そのインターフェイスをフォームと他のクラスとの間の契約にすることです。このようにして、クラスはフォームから完全に切り離され、インターフェイスを実装する任意のものを使用できます(テストをはるかに簡単にするための扉が開きます)。

interface IYourForm
{
    string FirstName { get; set; }
}

フォームクラスで:

class YourFormClass : Form, IYourForm
{
    // lots of other code here

    public string FirstName
    {
        get { return firstNameTextBox.Text; }
        set { firstNameTextBox.Text = value; }
    }
}

...そしてクラス:

class SomeClass
{
    private readonly IYourForm form;
    public SomeClass(IYourForm form)
    {
        this.form = form;
    }

    // and so on

}
43
Fredrik Mörk

FormクラスのrichTextBoxにTextを追加できなかった同じ問題に直面していました。そこで、updateというメソッドを作成しました。このメソッドでは、以前はClass1からメッセージを渡していました。

クラス:Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _Form1 = this;
        }
        public static Form1 _Form1;

        public void update(string message)
        {
            textBox1.Text = message;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 sample = new Class1();            
        }
    }

クラス:Class1.cs

public class Class1
    {        
        public Class1()
        {
            Form1._Form1.update("change text");
        }        
    }
12
Praveen

Form1.Designer.csの生成フィールドのアクセス修飾子をprivateからpublicに変更できます。これを変える

private System.Windows.Forms.TextBox textBox1;

これで

public System.Windows.Forms.TextBox textBox1;

Form1.textBox1という形式の参照を使用して処理できるようになりました。

Visual Studioは、削除して再作成しない限り、コントロールプロパティに変更を加えてもこれを上書きしません。

コードを直接編集することに不安がある場合は、UIから変更することもできます。 Modifiersプロパティを探します。

Modifiers

6
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
1
Chris Bond

これを行う簡単な方法を見つけ、テストしましたが、正しく動作します。最初にWindowsプロジェクトを作成し、TextBoxを挿入したフォームにtextBox1という名前を付け、button1という名前のボタンを挿入してから、class1という名前のクラスを追加します。 class1にTextBoxを作成しました:

class class1
    {
     public static TextBox txt1=new TextBox();  //a global textbox to interfece with      form1
    public static void Hello()
      {
       txt1.Text="Hello";
      }
    }

今あなたのフォームでこれを行います:

public partial class Form1 : Form
    {
     public Form1()
     {
      InitializeComponent();  
     }
     private void button1_Click(object sender, EventArgs e)
      {
       class1.txt1=textBox1;
       class1.Hello();
       }
    }

button1_Clickで、オブジェクトtextBox1をtxt1にコピーしたので、txt1にはtextBox1のプロパティがあり、uは別のフォームまたはクラスのtextBox1テキストを変更できます。

1

上記の例を試しましたが、説明どおりに機能するものはありませんでした。ただし、いくつかの例から組み合わされたソリューションがあります:

public static Form1 gui;
public Form1()
{
    InitializeComponent();
    gui = this;
    comms = new Comms();

}
public Comms()
{
    Form1.gui.tsStatus.Text = "test";
    Form1.gui.addLogLine("Hello from Comms class");
    Form1.gui.bn_connect.Text = "Comms";
}

これは、スレッドを使用していない限り機能します。スレッドを使用すると、より多くのコードが必要になり、私のタスクには必要ありませんでした。

1
Tim

Controlsコレクションにアクセスするためにフォームのインスタンスにアクセスする必要があり、それによりText Box'sテキスト。

方法の1つは、フォームのインスタンスをパブリックとして利用可能にするか、より良い方法で2番目のフォームの新しいコンストラクターを作成し、初期化中にForm1のインスタンスを受け取るようにすることです。

1
Shekhar_Pro

のようなフォームのプロパティを定義し、フォームインスタンスで使用できる他の場所でこれを使用します

public string SetText
{
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}
1
V4Vendetta
public partial class Form1 : Form
{

    public static Form1 gui;
    public Form1()
    {
        InitializeComponent();
        gui = this;

    }
    public void WriteLog(string log)
    {
        this.Invoke(new Action(() => { txtbx_test1.Text += log; }));

    }
}
public class SomeAnotherClass
{
    public void Test()
    {
        Form1.gui.WriteLog("1234");
    }
}

私はこの解決策が好きです。

0
santutu

この方法でラベルを更新しましたが、テキストボックスに簡単に変更できます。

クラス:

public Class1
{
    public Form_Class formToOutput;

    public Class1(Form_Class f){
        formToOutput = f;
    }

    // Then call this method and pass whatever string
    private void Write(string s)
    {
        formToOutput.MethodToBeCalledByClass(s);
    }
}

更新を行うフォームメソッド:

public Form_Class{

    // Methods that will do the updating
    public void MethodToBeCalledByClass(string messageToSend)
    {
       if (InvokeRequired) { 
           Invoke(new OutputDelegate(UpdateText),messageToSend); 
       }
    }

    public delegate void OutputDelegate(string messageToSend);
    public void UpdateText(string messageToSend)
    {
       label1.Text = messageToSend;
    }
}

最終的に

コンストラクターを介してフォームを渡すだけです:

Class1 c = new Class1(this);
0
C. Carter
Form1 form = new Form1(); 
form.textBox1.Text = "test";
0
PsychoCoder

他のクラスがForm1を継承し、textBox1がパブリックとして宣言されている場合、次の呼び出しを行うだけで、他のクラスからそのテキストボックスにアクセスできます。

otherClassInstance.textBox1.Text = "hello world";
0
tzup

値をテキストボックスに割り当てるためのグローバル変数またはプロパティを使用し、別のクラスの変数の値を指定し、フォームクラスのtextbox.textに割り当てます。