C# 在FormClosed事件上调用方法?

C# 在FormClosed事件上调用方法?,c#,winforms,combobox,user-controls,C#,Winforms,Combobox,User Controls,我有一个带有组合框和按钮的UserControl,它在UserControl的顶部打开一个表单。在此表单中,您可以从UserControls组合框中添加/编辑/删除项目 我在UserControl的类中还有一个RefreshData方法,当您按下UserControl中的其他控件时,该方法通过在ComboBox中重建datatable来刷新数据-此方法和组合框都具有公共访问修饰符。但不是静态的-这可能是问题所在 当RefreshData在其自己的类中被调用时,即当它被同一UserControl上

我有一个带有组合框和按钮的UserControl,它在UserControl的顶部打开一个表单。在此表单中,您可以从UserControls组合框中添加/编辑/删除项目

我在UserControl的类中还有一个RefreshData方法,当您按下UserControl中的其他控件时,该方法通过在ComboBox中重建datatable来刷新数据-此方法和组合框都具有公共访问修饰符。但不是静态的-这可能是问题所在

当RefreshData在其自己的类中被调用时,即当它被同一UserControl上的控件调用时,RefreshData工作正常。但是,当我关闭编辑数据的表单时,我还需要刷新UserControls组合框中的数据

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

这是我的代码:

刷新数据方法:

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(); 
    }   
从另一种形式调用它:

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();
    }
除了尝试两种事件处理程序外,我还尝试了:所有这些都是以关闭事件处理程序的形式出现的

r、 使无效;应用程序.DoEvents; r、 刷新; 我还尝试清除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事件处理程序中调用的方法中,我认为这并不可怕。调用Application.Exit或以老式方式关闭应用程序,则会生成此事件。这将触发清理方法

private void Clicked(object sender, EventArgs e)
{
    Application.Exit();
}

private void FormClosing(object sender, CancelEventArgs e)
{
    Cleanup();
}

private void Cleanup()
{
    // do cleanup here
}

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

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

什么是瑞纳?是用户控件吗?RRunner是用户控件。AddReport是表单`表单位于UserControl之上,例如MainForm持有UserControl>另一个表单在主表单之上打开-这么说这行不通/因此,您只需要另一个forminstance.Controls.OfType.First,而不是这个关键字;