【问题标题】:How to pass data of multiple text boxes from one form to another with button clicking?如何通过单击按钮将多个文本框的数据从一个表单传递到另一个表单?
【发布时间】:2013-01-24 18:57:32
【问题描述】:

我无法通过单击按钮将多个文本框的数据从Form1 传递到Form2。我尝试了以下方法,但它不起作用。

我做错了吗?如果是这样,我该怎么做?

Form1 代码:

public partial class Form1: Form {
    Form2 frm2;

    public Form1() {
        InitializeComponent();
    }

    private void btnInvoice_Click_1(object sender, EventArgs e) {
        this.Hide();

        if(frm2==null)
            frm2=new Form2();

        frm2.ValueFromForm1(txtFirstName.Text);
        frm2.ValueFromForm1(txtLastName.Text);
        frm2.ValueFromForm1(txtCellNo.Text);
        frm2.ValueFromForm1(txtDate.Text);
        frm2.ValueFromForm1(txtDueDate.Text);

        frm2.Show();
    }
}

Form2 代码:

public partial class Form2: Form {
    public Form2() {
        InitializeComponent();
    }

    public void ValueFromForm1(string value) {
        txtFirstName.Text=value;
        txtLastName.Text=value;
        txtCellNo.Text=value;
        txtMaskDueDate.Text=value;
        txtMaskDate.Text=value;
    }
}

【问题讨论】:

  • 您将所有文本框设置为相同的值。似乎有点奇怪。无论如何,发生了什么,因为这仍应显示您的 form2,所有文本框都设置为 txtDueDate

标签: c# winforms


【解决方案1】:

Form2 中创建Properties 怎么样?创建class 是解决方案之一,但您可以简单地将Properties 创建为getset

表格1

private void btnInvoice_Click_1(object sender, EventArgs e)
{
    this.Hide();
    using(var f = new Form2())
    {
      f.FirstName = txtFirstName.Text;
      f.LastName = txtLastName.Text;
      f.CellNo = txtCellNo.Text;
      f.ShowDialog();
    }
}

表格2

public string FirstName { get; set; }
public string LastName { get; set; }
public string CellNo { get; set; }

private void Form2_Load(object sender, EventArgs e)
{
    txtFirstName.Text = FirstName;
    txtLastName.Text = LastName;
    txtCellNo.Text = CellNo;
}

【讨论】:

    【解决方案2】:

    方法实现非常错误,或者至少是你想的逻辑!您正在为所有文本框分配相同的值。

    您可以通过两种方式解决问题。

    简单的方法是将Form2中控件的修饰符从private更改为internalpublic。更改修饰符后,您可以这样称呼它

    private void btnInvoice_Click_1(object sender, EventArgs e)
        {
            this.Hide();
            if (frm2 == null)
                frm2 = new Form2();
    
            frm2.txtFirstName.Text = txtFirstName.Text;
            frm2.txtLastName.Text = txtLastName.Text;
            frm2.txtCellNo.Text = txtCellNo.Text;
            frm2.txtDate.Text = txtDate.Text;
            frm2.txtDueDate.Text = txtDueDate.Text;
    
            frm2.Show();
        }
    

    如何修改修饰符?


    或通过创建多个方法的复杂方式,如

    public void ValueForFirstName(string value)
    {
        txtFirstName.Text = value;
    }
    
    
    public void ValuForLastName(string value)
    {
        txtLastName.Text = value;
    }
    

    【讨论】:

    • 这不是问题的真正答案
    • @bas - 让我先完成它!
    • @AppDeveloper 您确实想公开展示表单的内部控件。这使得维护表单之间的交互、表单状态的原因等变得非常变得更加困难。您应该始终创建方法、属性或其他一些机制来确保您不会公开控件。
    • @AppDeveloper 它正在养成一个坏习惯,这既会抑制学习更合适的实践的能力,也很可能在您有非平凡的项目时立即引起重大问题。在学习编程时做简单项目的全部目的是让你可以在学习障碍较少的情况下练习学习正确的编程技术。当你放弃这个概念时,你最终会弊大于利。
    • 我觉得this comment这里的另一个答案也适用于你的答案。
    【解决方案3】:

    您正在为所有文本框分配相同的值。结果将是您分配的最后一个值(即txtDueDate 文本)。创建不同的方法来为每个文本框分配值,或将值作为数组或自定义对象传递:

    public class Invoice
    {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string CellNo { get; set; }
       // etc
    }
    

    在表格 1 上

    private void btnInvoice_Click_1(object sender, EventArgs e)
    {
        this.Hide();
        if (frm2 == null)
            frm2 = new Form2();
    
        Invoice invoice = new Invoice();
        invoice.FirstName = txtFirstName.Text;
        invoice.LastName = txtLastName.Text;
        invoice.CellNo = txtCellNo.Text;
        // etc
        frm2.Invoice = invoice;
        frm2.Show();
    }
    

    在 Form2 上

    public Invoice Invoice
    {
       set
       {
            txtFirstName.Text = value.FirstName;
            txtLastName.Text = value.LastName;
            txtCellNo.Text = value.CellNo;
            // etc
       }
    }
    

    【讨论】:

    • 感谢您的回答。由于我是编程新手,我不明白您为什么要创建一个名为 Invoice 的类。我只有两个表格,即 Form1 和 Form2
    • @KiritiK 此数据传输类包含您从 Form1 传递到 Form2 的所有必需数据。因此,您的 Form2 需要所有这些数据,那么将所有数据保存在一个地方是有意义的。
    • 所以我必须创建一个名为 Invoice 的新类并添加对我的项目的引用?是这样的吗?
    • @是的,只需右键单击您的项目名称并选择 Add > Class.. 即可创建新类。然后将所有属性添加到该类,并使用它在表单之间传输数据。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多