从子窗体刷新DataGridView

时间:2011-12-14 04:30:58

标签: c# winforms

让我快速描述一下这个场景: 1)在Form1中,我有一个名为dgv_Employee的dataGridView和一个searchButton。 2)在Form1的pageload事件中,有一个代码填充dataGridView。在这里,我使用linq to sql来填充数据。(例如,dgv_Employee.dataSource = Dbmlobject.Employee;) 3)每当按下searchButton时,将打开一个新的Form Form2,用户通过提供适当的输入来搜索特定的员工。 4)单击搜索按钮时,我希望搜索结果显示在dataGridView和Form2中以便关闭。我已成功关闭form2。无法从form2刷新form1中的datagridview。

请耐心等待我3天。

4 个答案:

答案 0 :(得分:1)

您需要使用事件和委托来获取您的愿望输出。

让我举个例子。

假设Form1和Form2有两种形式。

  • Form1 包含 DataGridView 搜索按钮
  • Form2 包含名为ok的文本框按钮
  • 假设DataGridView填充了员工姓名,并且需要按名称搜索
  • 按下搜索按钮时打开Form2,然后在form2上填写员工姓名后,当按下ok按钮时,Form2将关闭,并且在员工姓名填写时过滤数据。

    因此,要获得上述结果,您可以执行以下操作:

Form1的代码:

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

以上代码做什么不需要解释。 &LT = :)
现在,

Form 2的代码:

 public delegate void OnSearch(string employeeName);

public partial class Form2 : Form
{
    public event OnSearch OnSearchClick;
    protected virtual void FireEvent(string employeeName)
    {
        if (OnSearchClick != null)
        {
            OnSearchClick(employeeName);
        }
    }

    public Form2()
    {
        InitializeComponent();
    }

    private void btnSearch_Click(object sender, EventArgs e)
    {
        string employeeName = txtEmp.Text;
        FireEvent(employeeName);

        this.Close();
    }
}

因为,我告诉你需要使用事件和委托,这里都是form2。

Form2 中,有一个名为 OnSearch 委托,其中包含字符串参数。代理 OnSearch 还有一个事件OnSearchClick 。 这里的代表在课堂上交付。

接下来,创建FireEvent函数,在调用此方法时触发事件OnSearchClick
单击btnSearch按钮时会调用 FireEvent 。这里employeeName是在方法中传递的,你可以在方法中传递更多的参数或对象,你可以在Form1上得到它,你可以应用过滤器。

  

现在可以编辑Form1的代码:

    private void btnSearch1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.OnSearchClick += new OnSearch(frm2_OnSearchClick);
        frm2.Show();
    }

    void frm2_OnSearchClick(string employeeName)
    {
        MessageBox.Show(employeeName);
    }

编辑From1的代码,如上所示,现在编写 frm2。 intellisense为您提供名为 OnSearchClick 的事件,选择该项,然后在一个空格类型 + =之后,然后按标签。它会生成 frm2_OnSearchClick 事件,因为您可以显示上面的代码。

将所有参数从Form2传递给Form1(我只传递了一个)并编写逻辑以在 frm2_OnSearchClick 事件中绑定DataGridView。

现在,每当您点击搜索按钮(位于Form2上)时,它将触发 frm2_OnSearchClick事件(位于Form1中),并且DataGridView将刷新。

答案 1 :(得分:1)

 Form2 form2 = new Form2();

 //add handler to catch when child form is closed    
 form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
 form2.ShowDialog();


private void form2_FormClosed(object sender, FormClosedEventArgs e)           
{              
 //when child form is closed, this code is executed   
// Bind the Grid view       
 PopulateControls();                                  
}

答案 2 :(得分:0)

在方法上添加绑定到网格,这样我就可以在事件的任何地方轻松调用。

private void BindTogrid()
{
 //call again you binding
dgv_Employee.dataSource = Dbmlobject.Employee; 
}

然后在你的

searchButton click()
{
Form2 form2 = new Form2();
form2.ShowDialog(); //Show Form2
 BindTogrid(); //Execute if Dialog has been closed;
}

希望得到这个帮助。

此致

答案 3 :(得分:0)

每当需要刷新网格时,只需重新分配dataSource。