あるフォームから別のフォームに値を送信する


84

2つのフォーム(c#)間で値を渡したい。どうすればいいですか?

Form1とForm2の2つのフォームがあります。

Form1にはボタンが1つ含まれています。そのボタンをクリックすると、Form2が開き、Form1が非アクティブモード(つまり選択不可)になっているはずです。

Form2には、1つのテキストボックスと1つの送信ボタンが含まれています。Form2のテキストボックスにメッセージを入力して送信ボタンをクリックすると、Form2が閉じ、Form1が送信された値で強調表示されます。

どうすればいいですか?誰かが簡単な例でこれを行うのを手伝ってくれますか?


この例はありましたか?
Millar 2012

回答:


58

これにはいくつかの解決策がありますが、これは私がよく使用するパターンです。

// 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; }
}

これは悪い行動だと思いました。これは素晴らしいことです。私もこのパターンを使用します
CasperT 2009年

まあ、それは悪い「行為」ではないと思いますが、このパターンを使用する前に考慮すべきセキュリティ上の影響があります。(しかし、素晴らしい単純な例+1)

1
また、form2.Close()の代わりにform2を使用する必要があることも忘れないでください。「DialogResult = DialogResult.OK;」を使用します または、フォームが開かれたことを検出しません。
Burgo855 2018

39
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

 public Form2(string qs)
    {
        InitializeComponent();
        textBox1.Text = qs;

    }

2
このコードをテストしました。Form2のデフォルトのコンストラクターを呼び出さないと public Form2(string qs):this(){}、フォームが適切に表示されません。
rene 2012年

これは私が使用したオプションであり、私にとっては問題なく機能しました。
サイモン

14

プロパティを定義する

public static class ControlID {  
    public static string TextData { get; set; }
}

の中に form2

private void button1_Click(object sender, EventArgs e)
{  
    ControlID.TextData = txtTextData.Text;   
}

データを取得しform1form3

private void button1_Click(object sender, EventArgs e)
{   
    string text=  ControlID.TextData;   
}

6

あるフォームから別のフォームにデータを渡すための一連の苦労の後、私はついに安定した答えを見つけました。それは魅力のように機能します。

あなたがする必要があるのは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

3
このアプローチの問題は、Form1を複数開いている場合、それらが「数量」値を上書きすることです。そして、Form2は、最後に開いたForm1の値を取得します。
Arash Aghlara 2015

4

でパブリック文字列を宣言します 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文字列で使用できます。


私とフォームであなたが提案したのと同じことをしていますが、私が得ている問題は、もう一度プッシュボタンを押している限り、戻り値がテキストフィールドに表示されないことです。
wsDev 2015年

3

私はさまざまなwinformプロジェクトに取り組んできましたが、アプリケーションがより複雑になると(ダイアログとそれらの間の相互作用が増える)、ウィンドウの開閉を手動で管理するのが難しいため、イベントシステムを使用して支援を開始しました。維持し、さらに発展させます。

私は自分のアプリケーションにCABを使用しました。これにはイベントシステムがありますが、あなたの場合はやり過ぎかもしれません:)より単純なアプリケーション用に独自のイベント作成できます。


イベントの+1、それらはうまくスケーリングします。しかし、実際にはどこに値を保存しますか?静的クラスは十分に単純ですが、それはグローバル変数の使用に近いので、不快に感じます。各フォームには、それに関連する設定用の独自のローカル変数がありますか?

2

form1で文字列を宣言しますpublicstring 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クレート変数Form1firstformRef;

private void Submitt_Click(object sender, EventArgs e)
    {
        firstformRef.TextBoxString = textBox1.Text;
        this.Close();
        firstformRef.Show();

    }

なぜ新しいものを作成するのForm1ですか?コンストラクターに渡しthisてみませんForm2か?

2

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();

        }

できます!


2

このコードでは、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();
    }
}

2

[OK]をので、Form1あなたは、この設定する必要があり、すべての最初の、テキストボックスを持っているForm1テキストボックスのプロパティで公衆にテキストボックスを。

コードフォーム1:

Public button1_click()
{
    Form2 secondForm = new Form2(this);
    secondForm.Show();
}

コンストラクターのForm1ようthisに渡します。

コードフォーム2:

Private Form1 _firstForm;

Public Form2(Form1 firstForm)
{
    _firstForm = firstForm:
}

Public button_click()
{
    _firstForm.textBox.text=label1.text;
    This.Close();
}

差分のためにこの投稿に来ました。私が答えた質問。これは好まれており、最新のプログラムでは、メインフォームを子供フォームに渡すと役立つことがよくあります。これは芋好ま答えをする必要があります
ニコWalsemann

1

次のように、Form1のテキストボックスをパラメータとして渡すことができます。

フォーム1のボタンハンドラーの場合:

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();
}

1

コンストラクターは、フォーム間またはGuiオブジェクト間でデータを渡すための最良の方法です。form1クリックボタンには次のものがあります。

Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();

フォーム2では、ユーザーがボタンをクリックすると、次のようなコードが表示されます。

this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();

フォーム1のフォームロード内に入ると、コンストラクターから値を取得するときに何でも実行するコードを追加できます。


ありがとう。これは私にとって最も理にかなっています。私はこのページの他のすべてを試しました、そしてこれはうまくいった唯一のものでした!
Chud37 2018年

0

フォームから別のフォームに値を渡す方法

1.)Form2に移動し、ダブルクリックします。コードでthisと入力します。

public Form2(string v)
{
  InitializeComponent();
  textBox1.Text = v;
}

2.)Form1に移動し、ダブルクリックします。コードでthisと入力します。// Form1のコマンドボタンで

private void button1_Click(object sender, EventArgs e)
{
   Form2 F2 = new Form2(textBox1.Text);
   F2.Show();
}

0

これは非常に簡単です。2つのウィンドウフォームForm1とForm2があり、textbox1のレコードをForm1からForm2に送信し、このレコードをForm2のlabel1に表示するとします。次に、Form2でlabel1という名前のラベルを作成し、label1のプロパティに移動して 'Modifiers' = publicを設定し、Form1でidtextBox1と名前submitのボタンを持つtextBoxを作成し、ボタンクリックイベントで次のコードを記述します

button1_Click(object sender, EventArgs e)
{
  Form2 obj=new Form2();
  obj.label1.text=textBox1.text.ToString();
  obj.show();
}

それだけです...この方法で、データセットレコードを別のフォームのdatagridviewにバインドできます......


0

必要に応じて、別のアプローチを利用できます。

  1. System.Actionの使用(ここでは、コールバック関数のように、メインフォーム関数をパラメーターとして子フォームに渡すだけです)
  2. OpenFormsメソッド(開いているフォームの1つを直接呼び出す)

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");

私はここで同様の質問に対する私の答えを提供しました


0

これを使用できます。

Form1ボタン1クリック

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    this.Hide();
    frm2.Show();
}

そしてこれをForm2に追加します

public string info = "";

Form2ボタン1クリック

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;
}

0

フォーム内のコントロールのモディファイアプロパティをパブリックに変更すると、別のフォームがそのコントロールにアクセスできます。fe:

    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        
    }

-1

公開イベントはいかがですか

私はこのようにします。

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からテキストを取得できます。

ありがとうございました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.