将值从一个表单发送到另一个表单

时间:2009-10-13 11:59:05

标签: c# winforms modal-dialog

我想在两个表单(c#)之间传递值。我该怎么办?

我有两种形式:Form1和Form2。

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

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

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

20 个答案:

答案 0 :(得分:46)

有几个解决方案,但这是我倾向于使用的模式。

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

答案 1 :(得分:33)

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 :(得分:12)

定义属性

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

答案 3 :(得分:4)

经过一系列努力将数据从一种形式传递到另一种形式后,我终于找到了一个稳定的答案。它就像魅力一样。

您需要做的就是在一个表单中将变量声明为public static datatype 'variableName',并将值分配给您要传递给另一个表单的此变量,并使用表单名称直接调用另一个表单中的变量(< strong>不要创建此表单的对象,因为可以直接访问静态变量)并访问此变量值。

这样的例子是,

<强> Form1中

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

<强>窗体2

TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2

答案 4 :(得分: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字符串中的返回数据。

答案 5 :(得分:3)

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

我已经将CAB用于我的应用程序,它有一个eventing system,但在你的情况下它可能有点过分了:)对于更简单的应用程序你可以write your own events

答案 6 :(得分: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();
    }

in form2 constructer

public Form2(ref Form1 form1handel)
    {
        firstformRef = form1handel;
        InitializeComponent();
    }

在form2 crate变量Form1 firstformRef;

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

    }

答案 7 :(得分: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();
    }
}

答案 8 :(得分: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();

        }

有效!

答案 9 :(得分:1)

构造函数是在表单或Gui对象之间传递数据的最佳方法,您可以执行此操作。 在form1单击按钮,您应该:

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

在表单2中,当用户单击该按钮时,它应该具有类似这样或类似的代码:

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

一旦进入表单1的​​表单加载,就可以添加代码,以便在从构造函数中获取值时执行任何操作。

答案 10 :(得分:1)

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

代码Form1:

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

答案 11 :(得分:0)

您可以将Form1的文本框作为参数传递,如下所示:

在Form 1 buttom handler:

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

答案 12 :(得分: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();
}

答案 13 :(得分:0)

这很简单。 假设您有2个窗体Form1和Form2,并且您希望将textbox1的记录从Form1发送到Form2,并在Form2的label1中显示此记录; 然后在Form2中创建一个名称为label1的标签,并转到label1的属性并设置'Modifiers'= public,在Form 1中创建一个id为textBox1的textBox和一个名为submit的按钮,然后在按钮点击事件上写下以下代码< / p>

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

多数民众赞成...... 通过这种方式,您可以将数据集记录绑定到另一个表单的datagridview ......

答案 14 :(得分:0)

使用以下方法获取值:

var form1 = new Form1();
string sample = form1.examplestring;

设置值:

var form1 = new Form1();
form1.examplestring = example;

但请检查字符串是否为&#34;公共字符串&#34;

public string example = "test";

答案 15 :(得分:0)

如果您愿意,可以使用不同的方法。

  1. 使用System.Action(这里只需将主窗体函数作为参数传递给子窗体,如回调函数)
  2. OpenForms方法(您直接调用其中一个打开的表单)
  3. 使用System.Action

    您可以将其视为传递给子表单的回调函数。

    Async.Sleep(5000) |> Async.RunSynchronously
    

    OpenForms方法

    这种方法很简单( 2行)。但只适用于开放的表单。 您需要做的就是在想要传递一些数据的地方添加这两行。

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

    我提供了类似问题here

    的答案

答案 16 :(得分:0)

您可以使用它;

Form1 button1单击

 public void moveMyFile(){

        string homePath = Environment.get_home_dir();
        string destPath = homePath + "/Desktop/dest/test.txt";
        string srcPath = homePath + "/Desktop/src/test.txt";

        GLib.File dest = GLib.File.new_for_path(destPath);
        GLib.File src = GLib.File.new_for_path(srcPath);

        print("\ndest path : %s \n", dest.get_path());
        print("src path : %s \n", src.get_path());

        if(src.query_exists()){
            try {
                print ("moveMyFile try\n");
                src.move(dest, FileCopyFlags.NONE, null);
            } catch (Error e) {
                print ("moveMyFile Error: %s\n", e.message);
            }
        }

    }

并将其添加到Form2

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

Form2 button1单击

public string info = "";

答案 17 :(得分:0)

如果将窗体中控件的“修饰符”属性更改为“公共”,则另一个窗体可以访问该控件。 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        
    }

答案 18 :(得分:0)

如何使用公共活动

我会这样做。

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

谢谢。

答案 19 :(得分:-1)

// In form 1
public static string Username = Me;

// In form 2's load block
string _UserName = Form1.Username;