#c# #winforms
#c# #winforms
Вопрос:
У меня есть две формы (C #). В одной форме есть метод, который принимает данные и сохраняет их в базе данных после закрытия формы, которую я хочу использовать в другой (основной форме) для обновления данных. Как это сделать с помощью ООП или просто сделать максимально красиво и хорошо.
Ответ №1:
Обычно, когда вы хотите разрешить обновление основной формы, вы создаете общедоступный метод в этой форме и вызываете его из другой формы, когда у нее есть новые данные и она может отправлять их в основную форму. Это не должно быть проблемой.
Обратите внимание, что если вы хотите отправить данные куда-либо, вам нужна ссылка на это место, т. Е. Вам нужна ссылка на основную форму в другой форме. Либо передайте this
из основной формы в конструктор другой формы, либо вы также можете сохранить ссылку в статическом поле в Program
классе (сделайте это в Main
методе, в котором вы создаете основную форму) и т.д.
Ответ №2:
Наиболее удобным для ООП решением, вероятно, было бы иметь событие в любой форме, которая «запускает» обновление данных, на которое подписано и обрабатывается методом другой формы. Вот базовая настройка:
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.
}
}
Вам не обязательно использовать событие; также можно использовать простой делегат, и он будет выполнять практически то же самое, при этом его можно указать в конструкторе формы (таким образом, требуется предоставить обработчик).
Ответ №3:
Вы можете сделать что-то подобное для обновления значений в одной форме из другой формы…
Код формы 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 amp;amp; e.SomeVal != null)
{
// Do the update on Form 1
// depend on your event arguments update the grid
//MessageBox.Show(e.SomeVal);
}
}