我有一个带有ComboBox和Button的UserControl,它在UserControl上打开一个Form。在此表单中,您可以添加/编辑/删除UserContols中的项目。组合框。
我还在UserControl的类中有一个方法RefreshData()
,当你按下UserControl中的其他控件时,它会刷新ComboBox中的数据(通过重建数据表)。 - 这个方法,以及ComboBox都有公共访问修饰符。 (但不是静态 - 这可能是问题?!)
RefreshData()
在从它自己的类中调用它时工作正常(即,当它被同一个UserControl上的控件调用时)。但是我还需要刷新UserControls中的数据。当我Close
编辑数据的表单时,组合框。
- 问题是FormClosing
处理程序正在调用RefreshData()
,但实际上并没有刷新其他表单上的数据。 - 我在FormClose
和FormClosing
事件处理程序中都试过这个。
(我知道它被调用,因为我可以在调试时进入它)
这是我的代码:
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();
}
从其他表单中调用它:
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'设置EventHandlers的方式。事件,但我只是看不到我出错了?
答案 0 :(得分:0)
您正在RRunner
事件中创建新的用户控件FormClosing
并致电refreshdata
。显然它不会起作用。您需要刷新现有的RRunner
。如果已将其添加到表单中,则以下代码应该可以正常工作。
void AddReport_FormClosing(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
RRunner r = this.Controls
.OfType<RRunner>()
.First();
r.refreshdata();
}
答案 1 :(得分:-2)
执行此操作的正确方法是将清理代码包含在FormClosing
事件处理程序中调用的方法中(在我看来,没有任何丑陋)。调用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
}