【问题标题】:Send values from one form to another form将值从一个表单发送到另一个表单
【发布时间】:2010-12-06 07:07:15
【问题描述】:

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

我有两种表格:Form1 和 Form2。

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

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

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

【问题讨论】:

  • 你有这方面的例子吗?

标签: c# winforms modal-dialog


【解决方案1】:

对此有多种解决方案,但这是我倾向于使用的模式。

// 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)
  • 另外不要忘记你还需要在 form2 上而不是 form2.Close();使用“DialogResult = DialogResult.OK;”否则它不会检测到表单已打开。
【解决方案2】:
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

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

    }

【讨论】:

  • 这段代码我已经测试过了,如果我们不调用Form2的默认构造函数,public Form2(string qs):this(){}表单将无法正常显示。
  • 这是我使用的选项,对我来说效果很好!
  • 这个在winforms上对我不起作用。这看起来更像是 WPF 解决方案!
【解决方案3】:

定义一个属性

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

【讨论】:

    【解决方案4】:

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

    您需要做的就是以一种形式将变量声明为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,它们会覆盖“数量”值。并且您的 Form2 获得最新打开的 Form1 的值。
    【解决方案5】:

    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字符串中使用返回的数据。

    【讨论】:

    • 我和你在我的表单中建议的一样,但我得到的问题是,只要我再次按下按钮,返回值就不会出现在文本字段中。
    【解决方案6】:

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

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

    【讨论】:

    • +1 用于事件,它们可以很好地扩展。但是您实际上将值存储在哪里?静态类很简单,但是这接近于使用全局变量,感觉……恶心。每个表单是否都有自己的局部变量来进行相关设置?
    【解决方案7】:

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

    【讨论】:

    • 为什么要创建一个新的Form1?为什么不将this 传递给Form2 构造函数?
    【解决方案8】:

    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】:

      在此代码中,您将文本传递给 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();
          }
      }
      

      【讨论】:

        【解决方案10】:

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

        代码形式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();
        }
        

        【讨论】:

        • 因为差异而来到这篇文章。我回答的问题。这是首选,在现代程序中,将主窗体传递给子窗体通常会有所帮助。这应该是imo首选的答案
        【解决方案11】:

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

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

        【讨论】:

          【解决方案12】:

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

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

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

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

          一旦进入表单 1 的表单加载,您可以添加代码来执行任何操作,因为您从构造函数获取值。

          【讨论】:

          • 谢谢。这对我来说最有意义。我尝试了此页面上的所有其他内容,这是唯一有效的!
          【解决方案13】:

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

          1.) 转到 Form2,然后双击它。在代码中输入 this。

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

          【讨论】:

            【解决方案14】:

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

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

            就是这样... 这样你就可以将数据集记录绑定到另一个表单的datagridview......

            【讨论】:

              【解决方案15】:

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

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

              我提供了对类似问题here的回答

              【讨论】:

                【解决方案16】:

                你可以用这个;

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

                【讨论】:

                  【解决方案17】:

                  如果您将窗体中控件的修饰符属性更改为公共,则另一个窗体可以访问该控件。 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】:
                    // In form 1
                    public static string Username = Me;
                    
                    // In form 2's load block
                    string _UserName = Form1.Username;
                    

                    【讨论】:

                      【解决方案19】:

                      如何使用公共事件

                      我会这样做的。

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

                      谢谢。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2018-10-29
                        • 2017-04-26
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-09-27
                        相关资源
                        最近更新 更多