首页 文章

从子窗体刷新DataGridView

提问于
浏览
0

让我快速描述一下这个场景: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 回答

  • 1

    你需要使用 Event and delegate 来获得你想要的输出 .

    我举个例子 .

    假设Form1和Form2有两种形式 .

    • Form1 包含 DataGridViewsearch button .

    • Form2 包含名为ok的 textboxbutton .

    • 假设DataGridView填充 employee name 并且需要 search by name .

    • Form2在按下搜索按钮时打开,然后在form2上填写员工姓名后,当按下ok按钮时,Form2关闭,数据在员工姓名填写时被过滤 .

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

    Code for Form1:

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

    上面的代码做什么不需要解释 . <= :)
    现在,
    Code for 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();
        }
    }
    

    至于,我告诉 you need use event and delegate ,这里都是form2 .

    Form2 中有一个名为 OnSearchdelegate 包含字符串参数 . 代表 OnSearch 也有 event OnSearchClick . 这里的代表在课堂上交付 .

    接下来,创建FireEvent函数,在调用此方法时触发 event 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 的事件,然后在一个空格后输入 += 然后 press tab . 它将生成 frm2_OnSearchClick 事件,因为您可以显示上面的代码 .

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

    现在,每当您单击 search button(which is on Form2) 时,它将触发 frm2_OnSearchClick event(which is in Form1) 并且DataGridView将刷新 .

  • 0
    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();                                  
    }
    
  • 1

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

    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;
    }
    

    希望这有帮助 .

    问候

  • 0

    每当需要刷新网格时只需重新分配dataSource即可 .

相关问题