【问题标题】:How to refresh datagridview when closing child form?关闭子窗体时如何刷新datagridview?
【发布时间】:2011-01-24 15:14:50
【问题描述】:

我的主窗体上有一个 dgv,有一个按钮可以打开另一个窗体以将一些数据插入到与 dgv 绑定的数据源中。我想当子窗体关闭 dgv 自动刷新时。我试图在子窗体关闭事件中添加它,但它没有刷新:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
        {
            frmMain frmm = new frmMain();

            frmm.itemCategoryBindingSource.EndEdit();
            frmm.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
            frmm.dataGridView1.Refresh();
        }

但是,当我在父窗体上的按钮中添加此代码时,它确实起到了作用:

        this.itemCategoryBindingSource.EndEdit();
        this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
        this.dataGridView1.Refresh();

【问题讨论】:

    标签: c# .net winforms datagridview refresh


    【解决方案1】:

    有很多方法可以做到这一点,但以下是最简单的,它会做你想做的事情并让你开始。

    • 在主窗体上创建一个公共方法。
    • 将第二种形式的构造函数修改为采用主形式。
    • 创建传递主表单对象的第二个表单的实例。
    • 关闭第二个窗体时,调用主窗体对象的公共方法。

    表格1

    public partial class Form1 : Form {
        public Form1() {
            //'add a label and a buttom to form
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e) {
            Form2 oForm = new Form2(this);
            oForm.Show();
        }
        public void PerformRefresh() {
            this.label1.Text = DateTime.Now.ToLongTimeString();
        }
    }
    

    Form2

    public class Form2 : Form {
        Form1 _owner;
        public Form2(Form1 owner) {
            _owner = owner;
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
        }
        private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
            _owner.PerformRefresh();
        }
    }
    

    【讨论】:

    • @rockyashkumar:代码在 Form1 和 Form2 之间拆分。我会更新答案。
    【解决方案2】:

    我们也可以这样进行:

    我们有 form_1 和 form_2

    1. 在form_1 中,创建一个公共方法。在这个公共方法中,我们放置了我们的东西;
    2. 在 form_2 中,我们创建了一个全局表单变量;
    3. 还在form_2中,通过form_2构造函数将form_1传入form_2;
    4. 仍在 form_2 中,让您的全局变量(我们在步骤 2 中创建的那个)接收我们在 form_2 构造函数中创建的新 form_1 实例;
    5. 在 closing_event 方法中,我们调用包含我们的东西的方法。

    使用我们的东西的方法是填充我们的 form1 列表、dataGridView、comboBox 或任何我们想要的方法。

    Form_1:

    public fillComboBox()//Step 1. This is the method with your stuff in Form1
    {
         foreach(var item in collection myInfo)
         {myComboBox.Items.Add(item)}
    
    }
    

    Form_2:

    Form1 instanceForm1;//Step 2
    public Form2(Form1 theTransporter)//Step 3. This the Form2 contructor. 
    { 
        InitializeComponent();
        instanceForm1 = theTransporter;//Step 4
    }
    
    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        instanceForm1.fillComboBox();//Step 5 we call the method to execute the task updating the form1
    }
    

    希望对你有帮助……

    【讨论】:

      【解决方案3】:

      您正在创建一个不影响实际主窗体实例的主窗体的新实例。您需要做的是,在主窗体本身上调用代码,就像您说的代码在按钮单击上起作用一样:

      private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
      {
          this.itemCategoryBindingSource.EndEdit();
          this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
          this.dataGridView1.Refresh();
      }
      

      【讨论】:

      • frmNew 不包含这些项目的定义,我必须创建一个 frmMain 实例才能访问它们。
      【解决方案4】:

      那里的答案很好!另一种方法是:

      1. 检查您要更新的表单是否已打开。
      2. 调用方法来刷新你的gridVieW。

        **在form1 中的refreshMethod() 中,确保将datasource 设置为null **

       if (System.Windows.Forms.Application.OpenForms["Form1"]!=null)
                  {
                      (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).refreshGridView("");
                  }

      【讨论】:

        猜你喜欢
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 2013-04-14
        • 1970-01-01
        • 2016-05-23
        • 2011-01-19
        相关资源
        最近更新 更多