我有两种形式(C#)。在一种形式中,有一种方法可以在关闭我希望在另一个(主窗体)上更新数据的表单之后获取数据并将它们存储在数据库中。如何使用OOP或简单地做到最美丽和最好。
答案 0 :(得分:1)
通常,当您想要更新主窗体时,可以在该窗体上创建一个公共方法,并在具有新数据时从另一个窗体中调用它,并将它们发送到主窗体。这应该不是问题。
请注意,如果您想将数据发送到某个地方,则需要对该地点的引用,即您需要在其他表单中引用主表单。将this
从主窗体传递到另一个窗体的构造函数,或者您也可以将引用存储在Program
类的静态字段中(在Main
方法中创建主要形式)等。
答案 1 :(得分:0)
对OOP最友好的解决方案可能是在“触发”数据更新的任何形式上发生事件,该事件由另一个表单的方法订阅和处理。这是一个基本的连线:
public class Form1:Form
{
public event EventHandler<MyDataObject> DataChanged;
...
public override void OnClosing(CancelEventArgs e)
{
//Put in logic to determine whether we should fire the DataChanged event
try
{
if(DataChanged != null) DataChanged(this, myFormCurrentData);
base.OnClosing(e);
}
catch(Exception ex)
{
//If any handlers failed, cancel closing the window until the errors
//are resolved.
MessageBox.Show(ex.Message, "Error While Saving", MessageBoxButtons.OK);
e.Cancel = true;
}
}
}
...
public class Form2:Form
{
//Called from wherever you would open Form1 from Form2
public void LaunchForm1()
{
var form1 = new Form1();
form1.DataChanged += HandleDataChange;
form1.Show();
}
private void HandleDataChange(object sender, MyDataObject dataObj)
{
//Do your data validation or persistence in this method; if it fails,
//throw a descriptive exception, which will prevent Form1 from closing.
}
}
您不必使用活动;也可以使用一个简单的委托,它可以做同样的事情,同时也可以在表单的构造函数中指定(因此需要提供处理程序)。
答案 2 :(得分:0)
您可以执行以下操作,以便从另一种形式更新一个表单中的值...
表单2代码
public event EventHandler<UpdatedEventArgs> updateEvent;
public class UpdatedEventArgs : EventArgs
{
public string SomeVal { get; set; } // create custom event arg for your need
}
protected virtual void OnFirstUpdateEvent(UpdatedEventArgs e)
{
if (updateEvent != null)
updateEvent(this, e);
}
private void button1_Click(object sender, EventArgs e)
{
UpdatedEventArgs eventData = new UpdatedEventArgs();
eventData.SomeVal = "test"; // set update event arguments, according to your need
OnFirstUpdateEvent(eventData);
}
public Form2()
{
InitializeComponent();
}
表单1代码
public Form1()
{
InitializeComponent();
Form2 form2 = new Form2();
form2.updateEvent += new EventHandler<Form2.UpdatedEventArgs>(form2_updateEvent); // create event handler to update form 1 from form 2
form2.Show();
}
void form2_updateEvent(object sender, Form2.UpdatedEventArgs e)
{
if (e != null && e.SomeVal != null)
{
// Do the update on Form 1
// depend on your event arguments update the grid
//MessageBox.Show(e.SomeVal);
}
}