所以我有这个表单,并且它是一个通过SQL方法从数据库填充的组合框。
我有另一种形式,它允许我们维护数据库表等。
所以我创建了第二个表单的新实例:
Form1 frm = new Form2;
frm.show();
一旦我完成了我想在第二个表单上做的事情并且关闭它,我需要以某种方式触发一个事件或某些东西,它将刷新组合框及其背后的代码。
我正在考虑整个表单的一些onchange或focus事件,问题是我有5个这样的组合框并且再次运行所有SQL。
我还想过传递一些变量thro但是我仍然需要一个事件。
任何理想都会很棒
答案 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;
}
}