从子窗体刷新 DataGridView

Posted

技术标签:

【中文标题】从子窗体刷新 DataGridView【英文标题】:Refresh DataGridView from child Form 【发布时间】:2011-12-14 04:30:57 【问题描述】:

让我快速描述一下场景: 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 天。

【问题讨论】:

将您的问题以适当的可读格式提出。就像在你的问题中使用 标签来换行等等。 【参考方案1】:

您需要使用 Event 和 delegate 来获得您想要的输出。 让我举个例子。

假设有两个表格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();

上面的代码做什么不用解释了。 现在,Form2 的代码:

 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 中有一个名为 OnSearchdelegate,其中包含字符串参数。还有一个代表OnSearch事件OnSearchClick。 在这里,代表在课堂上交付。 接下来,创建 FireEvent 函数,该函数在调用此方法时触发 事件 OnSearchClickFireEvent 在 btnSearch 按钮单击时调用。这里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. 时,智能感知会为您提供名为 OnSearchClick 的事件,然后选择该事件,然后在一个空格之后键入 += ,然后按 Tab。如您在上面的代码所示,它将生成 frm2_OnSearchClick 事件。 将 Form2 中的所有参数传递给 Form1(我只传递了一个)并编写逻辑以在 frm2_OnSearchClick 事件中绑定 DataGridView。 现在,每当您点击 搜索按钮(位于 Form2) 时,它都会触发 frm2_OnSearchClick 事件(位于 Form1) 并且 DataGridView 将刷新。

【讨论】:

【参考方案2】:
 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();                                  

【讨论】:

【参考方案3】:

在方法上将您的绑定添加到网格,以便在您的事件的任何地方轻松调用我。

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;

希望对您有所帮助。

问候

【讨论】:

【参考方案4】:

每当需要刷新网格时,只需重新分配数据源。

【讨论】:

以上是关于从子窗体刷新 DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

DevExpress TabbedView : 从子窗体创建子窗体

如何将值从子窗体传递回父窗体?

从子窗体调用主窗体

主窗体记录更改时从子窗体移动焦点

如何在 Windows Forms 2.0 中从子窗体关闭父窗体?

从子窗体访问去记录