C# 将值从一个窗体发送到另一个窗体

C# 将值从一个窗体发送到另一个窗体,c#,winforms,modal-dialog,C#,Winforms,Modal Dialog,我想在两种形式(c#)之间传递值。我怎么做 我有两张表格:表格一和表格二 Form1包含一个按钮。当我点击该按钮时,Form2应打开,Form1应处于非活动模式(即不可选择) Form2包含一个文本框和一个提交按钮。当我在Form2的文本框中键入任何消息并单击submit按钮时,Form2应关闭,Form1应突出显示Submited值 我怎么做?有人能帮我举个简单的例子吗。有几种解决方案,但这是我倾向于使用的模式 // Form 1 // inside the button click even

我想在两种形式(c#)之间传递值。我怎么做

我有两张表格:表格一和表格二

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

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


我怎么做?有人能帮我举个简单的例子吗。

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

// 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; }
}
在form1中声明字符串 公共字符串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();

    }

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

我已经在我的应用程序中使用了,它有一个,但在您的情况下可能有点过头了:)您可以在更简单的应用程序中使用它

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

表格1代码:

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
}
表格2代码:

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

        }
它起作用了

定义属性

public static class ControlID {  
    public static string TextData { get; set; }
}
表格2中

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

如何将值从表单传递到另一表单

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的文本框作为参数传递,如下所示:

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

form1

public string getdata;
form2 frm= new form2();
this.hide();
form2.show();
form1的按钮中

public string getdata;
form2 frm= new form2();
this.hide();
form2.show();
要将数据发送到
表单1
,您可以尝试任何事件以及该事件中的后续代码

form1 frm= new form1();
form1.getdata="some string to be sent to form1";

现在,在关闭
form2
并打开
form1
之后,您可以在
getdata
字符串中使用返回的数据。

经过一系列努力,我终于找到了一个稳定的答案。它很有魅力

您只需在一个表单中将变量声明为
公共静态数据类型“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

在这段代码中,您将文本传递给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();
    }
}
这很简单。 假设您有两个窗体Form1和Form2,您想将textbox1的记录从Form1发送到Form2,并在Form2的label1中显示该记录; 然后在Form2中创建一个名为label1的标签,转到label1的属性并设置'Modifiers'=public,在Form1中创建一个id为textBox1的文本框和一个名为submit的按钮,然后在按钮单击事件上编写以下代码

button1_Click(object sender, EventArgs e)
{
  Form2 obj=new Form2();
  obj.label1.text=textBox1.text.ToString();
  obj.show();
}
就这样。。。
通过这种方式,您可以将数据集记录绑定到另一个表单的datagridview……

构造函数是在表单或Gui对象之间传递数据的最佳方式,您可以这样做。 在form1单击按钮中,您应该具有:

Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();
在表单2中,当用户单击按钮时,应该有如下或类似的代码:

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

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

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

  • 使用System.Action(这里您只需像回调函数一样将主窗体函数作为参数传递给子窗体)
  • OpenForms方法(直接调用一个打开的表单)
  • 使用系统操作

    可以将其视为传递给子窗体的回调函数

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

    我提供了一个类似问题的答案

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

    代码格式1:

    Public button1_click()
    {
        Form2 secondForm = new Form2(this);
        secondForm.Show();
    }
    
    Private Form1 _firstForm;
    
    Public Form2(Form1 firstForm)
    {
        _firstForm = firstForm:
    }
    
    Public button_click()
    {
        _firstForm.textBox.text=label1.text;
        This.Close();
    }
    
    在构造函数中将
    Form1
    作为
    this
    传递

    代码格式2:

    Public button1_click()
    {
        Form2 secondForm = new Form2(this);
        secondForm.Show();
    }
    
    Private Form1 _firstForm;
    
    Public Form2(Form1 firstForm)
    {
        _firstForm = firstForm:
    }
    
    Public button_click()
    {
        _firstForm.textBox.text=label1.text;
        This.Close();
    }
    
    你可以用这个

    Form1按钮1单击

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        this.Hide();
        frm2.Show();
    }
    
    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;
    }
    
    并将其添加到表单2中

    public string info = "";
    
    表单2按钮1单击

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        this.Hide();
        frm2.Show();
    }
    
    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:


    使用公共事件如何

    我会这样做

    public class Form2
    {
       public event Action<string> SomethingCompleted;
    
       private void Submit_Click(object sender, EventArgs e)
       {
           SomethingCompleted?.Invoke(txtData.Text);
           this.Close();
       }
    }
    
    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
    公共静态字符串Username=Me;
    //在表格2的加载块中
    字符串_UserName=Form1.UserName;
    
    我认为这是坏的代码行为。这很好。我也会使用这个模式,我认为它不是“行为”,但是在使用这个模式之前要考虑安全性。(但是,简单的例子+ 1)也不要忘记,你还需要有Frave2而不是Fave2.Cuffe();“DialogResult=DialogResult.OK;”或者它不会检测到表单已打开。我已经测试了这段代码,如果我们不调用Form2的默认构造函数,
    PublicForm2(字符串qs):this(){}
    表单不会很好地显示。这是我使用的选项,对我来说效果很好!你有任何例子吗?为什么要创建一个新的
    表单1
    ?为什么不将
    这个
    传递给
    表单2
    构造函数?+1对于事件,它们的伸缩性很好。但是,你实际将值存储在哪里?静态类非常简单,但这接近于使用globa