2つのフォーム(c#)間で値を渡したい。どうすればいいですか?
Form1とForm2の2つのフォームがあります。
Form1にはボタンが1つ含まれています。そのボタンをクリックすると、Form2が開き、Form1が非アクティブモードになります(選択できません)。
Form2には、1つのテキストボックスと1つの送信ボタンが含まれています。 Form2のテキストボックスにメッセージを入力して送信ボタンをクリックすると、Form2が閉じ、Form1が送信された値で強調表示されます。
どうすればできますか?誰かが簡単な例でこれを行うのを手伝ってもらえますか?.
これにはいくつかの解決策がありますが、これは私が使用する傾向があるパターンです。
// Form 1
// inside the button click event
using(Form2 form2 = new Form2())
{
if(form2.ShowDialog() == DialogResult.OK)
{
someControlOnForm1.Text = form2.TheValue;
}
}
そして...
// Inside Form2
// Create a public property to serve the value
public string TheValue
{
get { return someTextBoxOnForm2.Text; }
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2(textBox1.Text);
frm2.Show();
}
public Form2(string qs)
{
InitializeComponent();
textBox1.Text = qs;
}
プロパティを定義する
public static class ControlID {
public static string TextData { get; set; }
}
form2
private void button1_Click(object sender, EventArgs e)
{
ControlID.TextData = txtTextData.Text;
}
form1
およびform3
のデータの取得
private void button1_Click(object sender, EventArgs e)
{
string text= ControlID.TextData;
}
あるフォームから別のフォームにデータを渡すための一連の苦労の後、私は最終的に安定した答えを見つけました。それは魅力のように機能します。
必要なことは、あるフォームで変数をpublic static datatype 'variableName'
として宣言し、別のフォームに渡したいこの変数に値を割り当て、フォーム名(静的変数に直接アクセスできるため)、この変数値にアクセスできるため、この形式のオブジェクトを作成しないでください。
そのような例は、
Form1
public static int quantity;
quantity=TextBox1.text; \\Value which you want to pass
Form2
TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2
form1
でパブリック文字列を宣言します
public string getdata;
form1
のボタン
form2 frm= new form2();
this.hide();
form2.show();
form1
にデータを送信するには、任意のイベントとそのイベントで続くコードを試すことができます
form1 frm= new form1();
form1.getdata="some string to be sent to form1";
form2
を閉じてform1
を開いた後、返されたデータをgetdata
文字列で使用できます。
私はさまざまなwinformプロジェクトに取り組んできましたが、アプリケーションがより複雑になると(ダイアログと対話が増える)、手動でウィンドウを開いたり閉じたりする管理が難しくなるため、イベントシステムを使用して手伝うようになりました。さらに維持し、開発します。
私は自分のアプリケーションに CAB を使用しましたが、 イベントシステムがあります しかし、それはあなたの場合にはやり過ぎかもしれません:)より簡単なアプリケーションのためにあなた自身のイベントを書くことができます
Form1コード:
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
MessageBox.Show("Form1 Message :"+Form2.t.Text); //can put label also in form 1 to show the value got from form2
}
Form2コード:
public Form2()
{
InitializeComponent();
t = textBox1; //Initialize with static textbox
}
public static TextBox t=new TextBox(); //make static to get the same value as inserted
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
できます!
このコードでは、テキストをForm2に渡します。 Form2はそのテキストをtextBox1に表示します。ユーザーがtextBox1に新しいテキストを入力し、送信ボタンを押します。 Form1はそのテキストを取得し、Form1のテキストボックスに表示します。
public class Form2 : Form
{
private string oldText;
public Form2(string newText):this()
{
oldText = newText;
btnSubmit.DialogResult = DialogResult.OK;
}
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = oldText;
}
public string getText()
{
return textBox1.Text;
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
DialogResult = System.Windows.Forms.DialogResult.OK;
}
}
}
そして、これはForm1コードです:
public class Form1:Form
{
using (Form2 dialogForm = new Form2("old text to show in Form2"))
{
DialogResult dr = dialogForm.ShowDialog(this);
if (dr == DialogResult.OK)
{
tbSubmittedText = dialogForm.getText();
}
dialogForm.Close();
}
}
form1で文字列を宣言しますpublic string TextBoxString;
form1クリックイベントの追加
private void button1_Click(object sender, EventArgs e)
{
Form1 newform = new Form1();
newform = this;
this.Hide();
MySecform = new Form2(ref newform);
MySecform.Show();
}
form2コンストラクター
public Form2(ref Form1 form1handel)
{
firstformRef = form1handel;
InitializeComponent();
}
form2クレート変数Form1 firstformRef;
private void Submitt_Click(object sender, EventArgs e)
{
firstformRef.TextBoxString = textBox1.Text;
this.Close();
firstformRef.Show();
}
Form1
にはテキストボックスがあります。まず、このForm1
テキストボックスをtextboxプロパティでpublicに設定する必要があります。
コード形式1:
Public button1_click()
{
Form2 secondForm = new Form2(this);
secondForm.Show();
}
コンストラクターでForm1
をthis
として渡します。
コードForm2:
Private Form1 _firstForm;
Public Form2(Form1 firstForm)
{
_firstForm = firstForm:
}
Public button_click()
{
_firstForm.textBox.text=label1.text;
This.Close();
}
コンストラクターは、これを行うことができるフォームまたはGuiオブジェクト間でデータを渡す最良の方法です。 form1クリックボタンには、次のものが必要です。
Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();
フォーム2では、ユーザーがボタンをクリックすると、次のようなコードが表示されます。
this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();
フォーム1のフォームロード内に入ると、コンストラクターから値を取得するときにコードを追加して、何でも実行できます。
単純に値を取得する:
var form1 = new Form1();
string sample = form1.examplestring;
値を設定するには:
var form1 = new Form1();
form1.examplestring = example;
しかし、文字列が「パブリック文字列」であることを確認してください
public string example = "test";
必要に応じて、別のアプローチを使用できます。
System.Actionの使用
これは、子フォームに渡されるコールバック関数と考えることができます。
// -------- IN THE MAIN FORM --------
// CALLING THE CHILD FORM IN YOUR CODE LOOKS LIKE THIS
Options frmOptions = new Options(UpdateSettings);
frmOptions.Show();
// YOUR FUNCTION IN THE MAIN FORM TO BE EXECUTED
public void UpdateSettings(string data)
{
// DO YOUR STUFF HERE
}
// -------- IN THE CHILD FORM --------
Action<string> UpdateSettings = null;
// IN THE CHILD FORMS CONSTRUCTOR
public Options(Action<string> UpdateSettings)
{
InitializeComponent();
this.UpdateSettings = UpdateSettings;
}
private void btnUpdate_Click(object sender, EventArgs e)
{
// CALLING THE CALLBACK FUNCTION
if (UpdateSettings != null)
UpdateSettings("some data");
}
OpenFormsメソッド
この方法は簡単です(2行)。ただし、開いているフォームでのみ機能します。必要なのは、データを渡したい場所にこれらの2行を追加することだけです。
Main frmMain = (Main)Application.OpenForms["Main"];
frmMain.UpdateSettings("Some data");
同様の質問に対する回答を提供しました here
これを使用できます。
Form1 button1クリック
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
this.Hide();
frm2.Show();
}
これをForm2に追加します
public string info = "";
Form2 button1クリック
private void button1_Click(object sender, EventArgs e)
{
info = textBox1.Text;
this.Hide();
BeginInvoke(new MethodInvoker(() =>
{
Gogo();
}));
}
public void Gogo()
{
Form1 frm = new Form1();
frm.Show();
frm.Text = info;
}
フォームのコントロールのModifiersプロパティをPublicに変更すると、別のフォームがそのコントロールにアクセスできます。 f.e. :
Form2 frm;
private void Form1_Load(object sender, EventArgs e)
{
frm = new Form2();
frm.Show();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(frm.txtUserName.Text);
//txtUserName is a TextBox with Modifiers=Public
}
これは非常に簡単です。 2つのウィンドウフォームForm1とForm2があり、textbox1のレコードをForm1からForm2に送信し、このレコードをForm2のlabel1に表示するとします。次に、Form2で名前がlabel1であるラベルを作成し、label1のプロパティに移動して 'Modifiers' = publicを設定し、フォーム1でid textBox1および名前submitのボタンでtextBoxを作成し、ボタンクリックイベントで次のコードを記述します
button1_Click(object sender, EventArgs e)
{
Form2 obj=new Form2();
obj.label1.text=textBox1.text.ToString();
obj.show();
}
それは...この方法では、データセットレコードを別のフォームのデータグリッドビューにバインドできます......
公開イベントを使用してはどうですか
このようにします。
public class Form2
{
public event Action<string> SomethingCompleted;
private void Submit_Click(object sender, EventArgs e)
{
SomethingCompleted?.Invoke(txtData.Text);
this.Close();
}
}
このようにForm1から呼び出します。
private void btnOpenForm2_Click(object sender, EventArgs e)
{
using (var frm = new Form2())
{
frm.SomethingCompleted += text => {
this.txtData.Text = text;
};
frm.ShowDialog();
}
}
その後、Form2が閉じられると、Form1はForm2からテキストを取得できます。
ありがとうございました。
フォームから別のフォームに値を渡す方法
1.)Form2に移動し、ダブルクリックします。コードでこれを入力します。
public Form2(string v)
{
InitializeComponent();
textBox1.Text = v;
}
2.)Form1に移動し、ダブルクリックします。コードでこれを入力します。 // Form1のコマンドボタンで
private void button1_Click(object sender, EventArgs e)
{
Form2 F2 = new Form2(textBox1.Text);
F2.Show();
}
次のように、Form1のテキストボックスをパラメーターとして渡すことができます。
Form 1 buttomハンドラーの場合:
private void button2_Click(object sender, EventArgs e)
{
Form2 newWindow = new Form2(textBoxForReturnValue);
newWindow.Show();
}
フォーム2
public static TextBox textBox2; // class atribute
public Form2(TextBox textBoxForReturnValue)
{
textBox2= textBoxForReturnValue;
}
private void btnClose_Click(object sender, EventArgs e)
{
textBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim();
this.Close();
}