【问题标题】:passing data between 3 windows forms in visual studio using C#使用 C# 在 Visual Studio 中的 3 个窗口窗体之间传递数据
【发布时间】:2011-02-21 23:16:02
【问题描述】:

我有一个 Windows 应用程序,它有 3 种形式:Form1、2、3。我想将文本框的文本从form2 发送到form1,然后将相同的文本从form1 发送到form3,也就是说,

来自FORM2的短信-->FORM1-->FORM3

  • Form 1,有 2 个按钮,openform2,openform3。
  • Form2 有一个文本框 form2_textbox 和一个按钮 send_to_form1_button
  • Form3 有一个文本框 received_from_form1_textbox

现在,

  • 点击按钮openform2form1Form2 打开,
  • Form2的文本框form2_textbox中输入了一个字符串,
  • 当单击此表单的按钮form2_button 时,我希望Form1 接收此字符串值并将其存储在字符串receivefromform2 中,
  • 然后将此字符串值显示到form3_textboxForm3
public partial class Form1 : Form
{
    string receivefromForm2a;

    public Form1()
    { InitializeComponent(); }

    public void Method_Receive_From_Form2(string receivefromForm2)
    {
        receivefromForm2a = receivefromForm2;
        Form3 f3 = new Form3(receivefromForm2a);
    }

    private void openform3_Click(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();**----this line gives error:No overload for method Form3 takes 0 arguments**

            f3.Show();
        }

    private void OPENFORM2_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        string loginname = form2_textbox.Text;
    }

    //SENDING VALUE OF TEXTBOX ON FORM2 TO FORM1.

    private void send_to_form1_button_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.Method_Receive_From_Form2(form2_textbox.Text);
    }
}

public partial class Form3 : Form
{
    public Form3(string receive_from_Form1)
    {
        InitializeComponent();
        received_from_form1_textbox.Text = receive_from_Form1;
    }
}

发生此错误是因为在form2 中,我在对象创建期间为form1 提供了参数。 所以我该怎么做?有没有其他方法可以做到这一点或如何消除此错误?

当我在方法 Method_Receive_From_Form2 中包含f3.Show() 时,没有错误。但这会使form3 自动加载,无需单击任何按钮。但我希望通过单击form1 上的按钮打开form3。然后在文本框中显示的值。

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    我建议将使用构造函数更改为使用属性。这将使事情得到适当的“包含”,而且非常简单。

    前:

    public partial class Form3 : Form
    {
       public String form1Text {get; set;}
    
       public Form3()
       {
           InitializeComponent();
       }
    }
    

    public partial class Form2 : Form
    {
       public Form2()
       {
           InitializeComponent();
           string loginname = form2_textbox.Text;
       }
    
       public String form2Text {get; set;}
    
       private void send_to_form1_button_Click(object sender, EventArgs e)
       {
    
           form2Text = form2_textbox.Text;
           this.DialogResult = DialogResult.Ok;
           this.Close();
       }
    }
    

    那么在表格1中:

    public partial class Form1 : Form
    {
       string receivefromForm2a;
    
       public Form1()
       { InitializeComponent(); }       
    
        private void openform3_Click(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();
            f3.form1Text = receivefromForm2a;
            f3.Show();
        }
    
    private void OPENFORM2_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        if(f2.ShowDialog() == DialogResult.Ok)
        {
          receivefromForm2a = f2.form2Text; //New Property on Form2.
        }
    }
    }
    

    【讨论】:

      【解决方案2】:

      像在 form2 中一样为 form3 创建非参数化构造函数:

      public Form3() { InitializeComponent(); }

      这通常用于在表单和/或委托中创建抽象方法,以更新文本框和在表单之间共享数据。或者创建一些数据持有者。

      【讨论】:

        【解决方案3】:

        在 Form3.cs 中创建一个具有字符串类型参数的构造函数。

        public Form3()
        {
           InitializeComponent();
        }
        public Form3(string text):this()
        {
           this.txtName.text=text;
        }
        

        【讨论】:

        • 请解释一下,并告诉我应该从现有代码中删除哪些代码?它不工作先生?
        【解决方案4】:

        抛出该错误是因为 Form3 不再具有默认构造函数,因为您使用 string 参数定义了一个构造函数。您需要创建一个像这样public Form3(){} 的默认构造函数。

        但是,您可以处理两种形式的事件,而不是做所有这些混乱。就像 Form1 是主窗体一样,可以这样做:

        在表格 1 中

        public string textFromForm2 = string.Empty;
        private void openform3_Click(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();
            f3.Controls["received_from_form1_textbox"].Text = textFromForm2 ;
            f3.Show();
        }
        
        private void OPENFORM2_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            //I am binding the event to a handler which will save text
            //you should check for null for f2.Controls returned any thing or not, i am leaving it for now
            f2.Controls["send_to_form1_button"].Click += (s,e)=>{
                         txtFromForm2 = f2.Controls["form2_textbox"].Text;
                  };
            f2.Show();
        }
        

        更新

        如果您不想使用 Lambadas,请像这样绑定事件:

        首先你需要一个对 Form2 的引用,所以在你的类中声明如下:

        Form2 f2;
        

        然后绑定事件(代替我之前给出的lambada)

        f2.Controls["send_to_form1_button"].Click  += new Eventhandler(click_handler);
        

        然后在 Form1 类的某个地方:

        protected void click_handler(object sender, EventArgs e)
        {
             if(f2 != null)
                 txtFromForm2 = f2.Controls["form2_textbox"].Text;
        }
        

        Form3 也是如此。

        【讨论】:

        • @Shekhar_Pro:亲爱的先生,你能解释一下绑定事件代码吗,我不知道其中发生了什么?我在我的代码中复制了它,但它给出了语法错误?
        • 我已经使用 Lambda 和匿名委托来绑定事件。如果您使用的是 .net 2.0(不支持它们),那么您可以执行我在更新中解释的常规绑定
        • @Shekhar_Pro:先生,我的问题还没有解决,请告诉我把你给的这段代码放在哪里,我很困惑,我无法实现一个简单的发送过程文本框文本从 Form2 到 Form1,然后从 Form1 到 form3,FORM1 是主父窗体。
        • 将此代码放入Form1。如果您仍然有问题.. 将您的整个代码提供给我们,我们会看到并告诉您要修改的内容..(在此处或 pastebin 上发布您的代码)
        • @Shekhar_Pro :先生,我已将上面的代码粘贴到我的问题本身中。我也必须对此进行更改吗?
        【解决方案5】:
        public partial class Form1 : Form
        {
            string receivefromForm2a;
        
            public Form1()
            { InitializeComponent(); }
        
            public void Method_Receive_From_Form2(string receivefromForm2)
            {
                receivefromForm2a = receivefromForm2;
                Form3 f3 = new Form3(receivefromForm2a);
            }
        
            private void openform2_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Show();
            }
        
            private void openform3_Click(object sender, EventArgs e)
            {
                Form3 f3 = new Form3(); //**----this line gives error:No overload for method Form3 takes 0 arguments**
                f3.Show();
            }
        }
        

        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
        
            //SENDING VALUE OF TEXTBOX ON FORM2 TO FORM1.
        
            private void send_to_form1_button_Click(object sender, EventArgs e)
            {
                Form1 f1 = new Form1();
            }
        }
        

        public partial class Form3 : Form
        {
            public Form3(string receive_from_Form1)
            {
                InitializeComponent();
        
                received_from_form1_textbox.Text = receive_from_Form1;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2018-01-07
          • 2015-12-07
          • 2013-10-12
          • 2011-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多