从儿童形式传递给父母

时间:2010-06-01 21:40:12

标签: c# winforms

所以我有这个表单,并且它是一个通过SQL方法从数据库填充的组合框。

我有另一种形式,它允许我们维护数据库表等。

所以我创建了第二个表单的新实例:

Form1 frm = new Form2;
frm.show();

一旦我完成了我想在第二个表单上做的事情并且关闭它,我需要以某种方式触发一个事件或某些东西,它将刷新组合框及其背后的代码。

我正在考虑整个表单的一些onchange或focus事件,问题是我有5个这样的组合框并且再次运行所有SQL。

我还想过传递一些变量thro但是我仍然需要一个事件。

任何理想都会很棒

6 个答案:

答案 0 :(得分:1)

我认为您在问题中得到了答案...使用事件/处理程序进行刷新。

E.g。

public class Form2 : Form
{
    public event EventHandler DbChanged;

    protected virtual void OnDbChanged()
    {
        ... // Raise event
    }

    // On OK button/FormClosing/Closed whatever, be sure to call OnDbChanging
}

然后在你的Form1代码中

var form2 = new Form2();
form2.DbChanged += new EventHandler(Form2_DbChanged); // Add method to handle change and update the appropriate combo box
form2.Show();

答案 1 :(得分:1)

如果你已经分配了这些表格,第一个表格拥有第二个表格,如下所示:

Form2 frm2 = new Form2();
//assuming that you're launching this form from within the first form
frm2.Owner = this;

然后你可以通过Owner属性获得对第一个表单的引用,从而调用它上面的方法。

Form2_FormClosed(object o, FormClosedEventArgs e)
{
    this.Owner.updateComboBox();
}

请注意,如果您想要从表单的控件发回数据,则需要FormClosing事件。

请注意,Owner属性具有一些其他特殊特性。值得注意的是,当选择父表单时,子表单将保持显示(在顶部)。

答案 2 :(得分:1)

您可以在此处使用委托和活动。

您的父类将创建子类的对象,并且还将订阅子类的事件。

每当子类需要传递某些东西/信号父类时,它就会引发一个事件。 当父母订阅了这些事件时,它将获取该数据并执行所需的操作。

希望这会对你有所帮助。

答案 3 :(得分:0)

表单是类。像任何其他类一样,他们可以拥有属性和事件。

您的Form2可以公开“DatabaseChanged”事件。 Form1或任何其他关心的表单都可以订阅该事件。当数据库发生更改时,Form2可以触发该事件,Form1会看到该事件并更新组合框。

答案 4 :(得分:0)

很多选项,但一个简单的选项是将主窗体作为对第二种窗体的引用。

Form2 frm = new Form2( this ); 
frm.Show();

然后当Form2完成其工作时,它可以调用主窗体上的某个方法来更新

public class Form2 : Form 
{
    public Form2( Form1 form1 )
    { 
        this.form1 = form1;
    }

    /// ...
    public void Work()
    {
        // ...
        form1.Update( someData );
    }
}

从维护角度来看,不一定是理想的,但对小型应用程序可行。

答案 5 :(得分:0)

假设您的组合名称为id cmb1和

cmb1.DataSource = ds1;

你需要打电话给新窗口做一些工作&无论何时关闭该窗口,您的父级都会刷新,或者cmb1将拥有最新数据。

从你的父窗口

像这样调用你的chlid窗口

if (NameOfWindow.RequestAction(ref ds1)) // let RequestAction is a method
{
       ///refresh your data source of combo                    
}

并且在子窗口中,方法应该是这样的:

public static bool RequestAction(ref ds1)
        {
            NameOfWindow frm = new NameOfWindow();
            if (frm.ShowDialog() == DialogResult.OK)
            {
                //do what ever you want to do and update the ds1               
                return true;
            }
            else
            {
                return false;
            }                     

        }