调用FormClosed事件的方法

本文关键字:方法 事件 FormClosed 调用 | 更新日期: 2023-09-27 18:16:13

我有一个UserControl与一个组合框和一个按钮打开一个窗体在UserControl的顶部。在此表单中,您可以添加/编辑/删除用户控件组合框中的项。

我在UserControl的类中也有一个方法RefreshData(),当你按下UserControl中的其他控件时,它刷新ComboBox中的数据(通过重建数据表)。-这个方法和组合框都有公共访问修饰符。(但不是静态的-这可能是问题所在?!)

RefreshData()工作良好,当它被调用从自己的类(即,当它被同一UserControl上的控件调用)。但是,我还需要在用户控件的组合框中刷新数据,当我Close编辑数据的表单。

-问题是FormClosing处理程序正在调用RefreshData(),但它实际上并没有刷新另一个表单上的数据。-我在FormCloseFormClosing事件处理程序中都尝试过。(我知道它正在被调用,因为我可以在调试时进入它)

这是我的代码

RefreshData()方法:

public void refreshdata()
    {
        SQLiteConnection sqlcon = new SQLiteConnection("data source =" + SqliteClass.dir + "''SupportDash.sqlite");
        sqlcon.Open();
        SQLiteCommand getdataDesc = new SQLiteCommand("SELECT ID, URLDescription, URLAddress, Type from URLS", sqlcon);
        SQLiteDataReader reader;
        reader = getdataDesc.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(string));
        dt.Columns.Add("URLDescription", typeof(string));
        dt.Load(reader);
        //Description ComboBox
        Report.ValueMember = "ID";
        Report.DisplayMember = "URLDescription";
        Report.SelectedValue = "ID";
        Report.DataSource = dt;
        sqlcon.Close(); 
    }   

从另一个Form调用它:

this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(AddReport_Close);
void AddReport_FormClosing(object sender, System.Windows.Forms.FormClosedEventArgs e)
    {
        RRunner r = new RRunner();
        r.refreshdata();
    }

以及尝试两个事件处理程序,我也尝试过:(所有这些都在Form_Closing事件处理程序)

  • r.Invalidate(); Application.DoEvents();
  • r.Refresh();

我也试过清除UserControl上的所有控件,然后重新绘制它们:

foreach (Control ctrl in splitContainer1.Panel2.Controls)
        {
            splitContainer1.Panel2.Controls.Clear();
            break;
        }
        RRunner rrunner = new RRunner();
        splitContainer1.Panel2.Controls.Add(rrunner); 

因为这些工作都没有,我相信我的问题在于我设置的"FormClosed"事件的eventhandler的方式,但我只是看不到我是错的?

调用FormClosed事件的方法

您正在FormClosing事件中创建新的用户控件RRunner并调用refreshdata。显然这是行不通的。您需要刷新现有的RRunner。如果它被添加到表单中,那么下面的代码应该可以工作。

void AddReport_FormClosing(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
    RRunner r = this.Controls
                    .OfType<RRunner>()
                    .First();
    r.refreshdata();
}

这样做的正确方法是将您的清理代码包含在FormClosing事件处理程序中调用的方法中(在我看来,没有什么丑陋的)。调用应用程序。以老式的方式退出或关闭应用程序将导致生成此事件。触发清理方法。

private void Clicked(object sender, EventArgs e)
{
    Application.Exit();
}
private void FormClosing(object sender, CancelEventArgs e)
{
    Cleanup();
}
private void Cleanup()
{
    // do cleanup here
}