C# 在FormClosed事件上调用方法?
我有一个带有组合框和按钮的UserControl,它在UserControl的顶部打开一个表单。在此表单中,您可以从UserControls组合框中添加/编辑/删除项目 我在UserControl的类中还有一个RefreshData方法,当您按下UserControl中的其他控件时,该方法通过在ComboBox中重建datatable来刷新数据-此方法和组合框都具有公共访问修饰符。但不是静态的-这可能是问题所在 当RefreshData在其自己的类中被调用时,即当它被同一UserControl上的控件调用时,RefreshData工作正常。但是,当我关闭编辑数据的表单时,我还需要刷新UserControls组合框中的数据 -问题是FormClosing处理程序正在调用RefreshData,但实际上并没有刷新另一个表单上的数据-我在FormClose和FormClosing事件处理程序中都尝试过这一点。 我知道它被调用了,因为我可以在调试时进入它 这是我的代码: 刷新数据方法:C# 在FormClosed事件上调用方法?,c#,winforms,combobox,user-controls,C#,Winforms,Combobox,User Controls,我有一个带有组合框和按钮的UserControl,它在UserControl的顶部打开一个表单。在此表单中,您可以从UserControls组合框中添加/编辑/删除项目 我在UserControl的类中还有一个RefreshData方法,当您按下UserControl中的其他控件时,该方法通过在ComboBox中重建datatable来刷新数据-此方法和组合框都具有公共访问修饰符。但不是静态的-这可能是问题所在 当RefreshData在其自己的类中被调用时,即当它被同一UserControl上
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,而不是这个关键字;