如何在父容器winforms中的两个子窗体之间进行数据同步?

时间:2016-08-05 12:59:02

标签: c# winforms datagridview

我有这种情况我想在我的dataGridView中同步信息,当我将其插入我的添加表单时,就像你在这张图片上看到的那样。enter image description here

在插入按钮上的插入表单中,我调用添加表单,以便像这样弹出

  private void button1_Click(object sender, EventArgs e)
    {
        if (addForm==null)
        {
            addForm = new AddForm();
        }
        addForm.MdiParent = this.ParentForm;
        addForm.FormClosed += AddForm_FormClosed;
        addForm.Show();

    }

    private void AddForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        addForm = null;
    }

在“接受”中的“添加”表单上单击“我插入信息”并从“插入”表单中调用fillDataGrid()方法进行数据同步但未显示任何内容当我关闭“插入”表单并再次调用时,会显示数据是否有人怀疑我该怎么办?这是我第一次与MdiContainer合作?

private void buttonAccept_Click(object sender, EventArgs e)
    {
        if (validation())
        {
            Proizvod product = new Proizvod();
            product.NazivProizvoda = textBoxName.Text;
            product.Opis = textBoxDescription.Text;
            product.SerijskiBroj = textBoxNumber.Text;
            product.ZemljaPorijekla = textBoxCountry.Text;

            if (pDal.insertProduct(product)==0)
            {
                MessageBox.Show("Informations are successfully inserted","Message");
                InsertForm inForm = new InsertForm();
                inForm.fillDataGrid();
            }
        }
    }

我的fillDataGrid()方法和InsertForm的Load事件:

 public void fillDataGrid()
    {
        dataGridViewProducts.DataSource = null;
        dataGridViewProducts.AutoGenerateColumns = false;
        dataGridViewProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        dataGridViewProducts.ColumnCount = 3;

        dataGridViewProducts.Columns[0].Name = "Product name";
        dataGridViewProducts.Columns[0].DataPropertyName = "NazivProizvoda";
        dataGridViewProducts.Columns[1].Name = "Country";
        dataGridViewProducts.Columns[1].DataPropertyName = "ZemljaPorijekla";
        dataGridViewProducts.Columns[2].Name = "Product number";
        dataGridViewProducts.Columns[2].DataPropertyName = "SerijskiBroj";
        dataGridViewProducts.DataSource = pDal.getAllProducts();
    }

    private void InsertForm_Load(object sender, EventArgs e)
    {
        fillDataGrid();
    }

    private void InsertForm_Shown(object sender, EventArgs e)
    {
        dataGridViewProducts.CurrentCell = null;
        dataGridViewProducts.ClearSelection();
    }

1 个答案:

答案 0 :(得分:1)

目前在buttonAccept_Click代码中,您已创建了列表表单的新实例,并将其称为FillGrid。这样您就可以操作列表表单的另一个实例,该实例与打开的实例不同,您可以看到。您正在填写一份您未显示的其他表格。

不是创建新实例,而是为第二个表单创建一个构造函数,该构造函数接受第一个表单类型的参数。然后,当您要创建seccod表单的新实例时,将第一个表单(this)的实例传递给第二个表单。然后在保存按钮中调用传递的实例的FillGrid方法。

有关如何操纵其他表单的更多信息,请阅读this post。它包含一些有用的选项:

  • 创建时将数据传递到第二个表单
  • 显示
  • 后操纵第二张表格
  • 从第二张表格操作第一张表格

以下是一些属于ListForm的代码:

private void ShowAddForm_Click(object sender, EventArgs e)
{
    if (addForm == null)
    {
        addForm = new AddForm(this);
        addForm.MdiParent = this.ParentForm;
        addForm.FormClosed += AddForm_FormClosed;
    }
    addForm.Show();
}
private void AddForm_FormClosed(object sender, FormClosedEventArgs e)
{
    addForm = null;
}

以下是AddForm

的代码
public class AddForm
{
    MyListForm listForm;
    public AddForm(MyListForm f)
    {
        InitializeComponent();
        listForm = f;
    }
    private void SaveVutton_Click(object sender, EventArgs e)
    {
        //perform validation and save data
        f.FillGrid();
    }
}