在FormClosed事件上调用方法?

时间:2014-08-03 11:17:50

标签: c# winforms combobox user-controls

我有一个带有ComboBox和Button的UserControl,它在UserControl上打开一个Form。在此表单中,您可以添加/编辑/删除UserContols中的项目。组合框。

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

RefreshData()在从它自己的类中调用它时工作正常(即,当它被同一个UserControl上的控件调用时)。但是我还需要刷新UserControls中的数据。当我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(); 
    }   

从其他表单中调用它:

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的方式。事件,但我只是看不到我出错了?

2 个答案:

答案 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
}