将值从一种形式发送到另一种形式


84

我想在两个窗体(c#)之间传递值。我该怎么做?

我有两种形式:Form1和Form2。

Form1包含一个按钮。当我单击该按钮时,Form2应该打开,而Form1应该处于非活动模式(即,不可选择)。

Form2包含一个文本框和一个提交按钮。当我在Form2的文本框中键入任何消息并单击Submit按钮时,Form2应该关闭,而Form1应该突出显示所提交的值。

我该怎么做?有人可以通过一个简单的例子帮助我做到这一点。


你有这个例子吗?
Millar 2012年

Answers:


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,

好吧,我认为这不是坏的“行为”,但是在使用此模式之前需要考虑安全性。(但是,简单的示例+1)

1
同样不要忘记,您还需要使用form2而不是form2.Close();。使用“ DialogResult = DialogResult.OK;” 否则它将无法检测到表单已打开。
Burgo855 '18

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年

这是我使用的选项,对我来说效果很好!
西蒙(Symon)

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'以一种形式声明一个变量,然后将该值分配给要传递给另一种形式的变量,然后直接使用表单名称以另一种形式调用此变量(不要以这种形式创建该对象)可以直接访问静态变量)并访问此变量值。

这样的例子是

表格1

public static int quantity;
quantity=TextBox1.text; \\Value which you want to pass

表格2

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

3

我从事过各种winform项目,并且随着应用程序变得越来越复杂(它们之间的更多对话框和交互),然后我开始使用一些事件系统来帮助我,因为手动管理打开和关闭窗口将很困难。保持和进一步发展。

我已经将CAB用于我的应用程序,它具有事件系统,但在您的情况下可能会显得过大:)您可以为更简单的应用程序编写自己的事件


对于事件+1,它们可以很好地扩展。但是,您实际上将值存储在哪里?静态类很简单,但是它接近使用全局变量,感觉很糟糕。每个表格是否都有与之相关的局部变量?

2

在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?为什么不传递thisForm2构造函数?

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中输入新文本,然后按Submit按钮。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

好吧,Form1还有一个文本框,首先,您必须Form1在textbox属性中将此文本框设置为public。

代码表1:

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

Form1this在构造函数中那样传递。

代码Form2:

Private Form1 _firstForm;

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

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

由于差异而来到了此职位。我回答的问题。这是首选,在现代程序中,将主窗体传递给子窗体通常会有所帮助。这应该是imo的首选答案
Nico Walsemann

1

您可以将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();
}

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 '18 -10-5

0

如何将值从窗体传递到另一个窗体

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

0

这很简单。假设您有2个窗口,分别是Form1和Form2,并且要将textbox1的记录从Form1发送到Form2,并在Form2的label1中显示该记录;然后在Form2中创建一个名称为label1的标签,并转到label1的属性并设置'Modifiers'= public,然后在Form 1中创建一个ID为textBox1的textBox和一个名称为commit的按钮,然后在按钮click事件上编写以下代码

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方法(您直接调用其中一个打开的表单)

使用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行)。但是仅适用于开放形式。您需要做的就是将这两行添加到要传递数据的任何位置。

Main frmMain = (Main)Application.OpenForms["Main"];
frmMain.UpdateSettings("Some data");

在这里提供了类似问题的答案


0

您可以使用它;

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

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获取文本

谢谢。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.