【问题标题】:How do I pass data from child of child form to parent form in C#?如何在 C# 中将数据从子窗体的子窗体传递到父窗体?
【发布时间】:2016-02-29 19:16:27
【问题描述】:

我是 C# 新手。我在 Windows 窗体中的项目中有以下内容:

Form1 带有按钮和 DataGridView。

Form2 带按钮。

Form3 带有按钮和 3 个文本框。

如截图所示在form1中,我点击buttonOpenForm2弹出form2。然后在 form2 我点击 buttonOpenForm3 form3 弹出,其中有 3 个文本框和按钮。现在 3 个表单都打开了。

我在 textBox1、textBox2 和 textBox3 中输入值,当单击 buttonAddRow(来自 form3)时,我希望将这些值插入到 Form1 中的 DataGRidView 中。

我的问题是: 如何在不关闭 form2 和 form3 的情况下从 form3(子窗体的子窗体)向 Form1(父窗体)中的 DataGridView 添加一行?我的意思是我想在 form2 和 form3 仍然打开时传递数据。

请帮助我。谢谢你

表格1:

public partial class Form1 : Form
{


    public Form1()
    {
        InitializeComponent();

    }

    private void buttonOpenForm2 _Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }

}

表格2:

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

    private void buttonOpenForm3 _Click(object sender, EventArgs e)
    {
        Form3 frm3 = new Form3();
        frm3.Show();
    }
}

Form3:

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

    private void buttonAddRow _Click(object sender, EventArgs e)
    {
        //What to write here to insert the 3 textboxes values into DataGridView?

    }
}

【问题讨论】:

标签: c#


【解决方案1】:

1 解决方案

您可以使用模式通过构造函数(Show 方法之前的特殊设置器)进一步发送数据,并在公共 getter 关闭窗口后将它们取回。

public partial class Form2 : Form
{        
    Data Data1 {get; set;}
    //Instead of Data you can pass Form1 class as parametr. 
    //But this might lead to unreadable code, and using too mutch methods and fields that could be private, public
    public Form2(Data data)
    {
        InitializeComponent();
        Data1 = data;
    }

    private void buttonOpenForm3 _Click(object sender, EventArgs e)
    {
        //Repeat pattern
        Form3 frm3 = new Form3(Data1);
        frm3.Show();
    }    
}

您也不必调用第三个窗口构造函数。只需创建第三个窗口的实例以第一种形式存储它,然后通过调用您传递数据的第一个实例来显示它。但这在更大范围内可能是不好的做法。

2 解决方案

您可以使用单例模式。在第一种形式的构造函数中创建第一种形式的实例并在第三种形式中使用它。但是您需要确保内存中不会有超过一个且始终存在一个此对象的实例。

【讨论】:

  • 非常感谢。我将不得不阅读有关事件的更多信息,因为这对我来说是新主题,一旦完成,我将测试您的代码。谢谢
【解决方案2】:

您不能期望获得可以粘贴的完整代码。我很快在记事本中写下了这篇文章,让您了解事件在这种情况下如何发挥最佳作用。我假设Form1直接打开Form3。下面的解决方案显示了如何使用事件。

您的家庭作业是通过在其间添加另一个表单 Form2 来使其正常工作。您可以通过位于中间的 Form2 传播相同的事件来做到这一点。

Form3.cs

public partial class Form3 : Form
{
    public event EventHandler<AddRecordEventArgs> RecordAdded

    public Form3()
    {
        InitializeComponent();
    }

    private void buttonAddRow _Click(object sender, EventArgs e)
    {
        OnRecordAdded();
    }

    private void OnRecordAdded() {
        var handler = RecordAdded;
        if(RecordAdded != null) {
            RecordAdded.Invoke(this, new AddRecordEventArgs(txtQty.Text, txtDesc.Text, txtPrice.Text))
        }
    }
}

AddRecordEventArgs.cs

public class AddRecordEventArgs : EventArgs
{
    public AddRecordEventArgs(string qty, string desc, string price) {
        Quantity = qty;
        Description = desc;
        Price = price;
    }

    public int Quantity { get; private set; }
    public string Description { get; private set; }
    public decimal Price { get; private set; }
}

Form1.cs

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

    private void buttonOpenForm3_Click(object sender, EventArgs e)
    {
        Form3 frm3 = new Form3();
        frm3.RecordAdded += Form3_RecordAdded;
        frm3.Show();
    }

    private void Form3_RecordAdded(object sender, AddRecordEventArgs e) {
        // Access e.Quantity, e.Description and e.Price
        // and add new row in grid using these values.
    }
}

【讨论】:

  • 非常感谢。我将不得不阅读有关事件的更多信息,因为这对我来说是新主题,一旦完成,我将测试您的代码。谢谢
【解决方案3】:

您可以将所有者传递给方法Show() 以获取新表单。然后您可以从Owner 属性获取所有者表单。

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

这样就可以得到Form1:

(Form1)frm2.Owner

并调用 Form1 类的公共方法并将新数据传递给那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多