winform
と呼ばれるForm1とtextbox
と呼ばれるtextBox1
Form1では、次のように入力してテキストを設定できます。
textBox1.text = "change text";
今、私は別のクラスを作成しました。このクラスでtextBox1を呼び出すにはどうすればよいですか?したがって、このクラスのtextBox1のテキストを変更します。
この新しいクラスからForm1にアクセスするにはどうすればよいですか?
しないことをお勧めします。フォームでのテキスト編集の実装方法に依存するクラスが本当に必要ですか、それともテキストを取得および設定できるメカニズムが必要ですか?
後者をお勧めします。したがって、フォームで、問題の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
}
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");
}
}
Form1.Designer.cs
の生成フィールドのアクセス修飾子をprivate
からpublic
に変更できます。これを変える
private System.Windows.Forms.TextBox textBox1;
これで
public System.Windows.Forms.TextBox textBox1;
Form1.textBox1
という形式の参照を使用して処理できるようになりました。
Visual Studioは、削除して再作成しない限り、コントロールプロパティに変更を加えてもこれを上書きしません。
コードを直接編集することに不安がある場合は、UIから変更することもできます。 Modifiersプロパティを探します。
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
これを行う簡単な方法を見つけ、テストしましたが、正しく動作します。最初に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テキストを変更できます。
上記の例を試しましたが、説明どおりに機能するものはありませんでした。ただし、いくつかの例から組み合わされたソリューションがあります:
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";
}
これは、スレッドを使用していない限り機能します。スレッドを使用すると、より多くのコードが必要になり、私のタスクには必要ありませんでした。
Controls
コレクションにアクセスするためにフォームのインスタンスにアクセスする必要があり、それによりText Box's
テキスト。
方法の1つは、フォームのインスタンスをパブリックとして利用可能にするか、より良い方法で2番目のフォームの新しいコンストラクターを作成し、初期化中にForm1のインスタンスを受け取るようにすることです。
のようなフォームのプロパティを定義し、フォームインスタンスで使用できる他の場所でこれを使用します
public string SetText
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
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");
}
}
私はこの解決策が好きです。
この方法でラベルを更新しましたが、テキストボックスに簡単に変更できます。
クラス:
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);
Form1 form = new Form1();
form.textBox1.Text = "test";
他のクラスがForm1を継承し、textBox1がパブリックとして宣言されている場合、次の呼び出しを行うだけで、他のクラスからそのテキストボックスにアクセスできます。
otherClassInstance.textBox1.Text = "hello world";
値をテキストボックスに割り当てるためのグローバル変数またはプロパティを使用し、別のクラスの変数の値を指定し、フォームクラスのtextbox.textに割り当てます。