1

大家好,我的应用程序中有三个表单,我的 form1 将显示数据库中的一些数据,我将有add/edit按钮,对应于用户选择的选项,我将加载 Form2 和 Form3。现在我想Form1在用户单击任何表单上的保存后刷新数据Form2, Form3

一般我们写一个实例如下

Form1 _Form1;
public Form2(Form1 frm)
{
     _Form1 = frm;
}

private void button1_Click(object sender, EventArgs e)
{
  _Form1.UpDateData();
}

但是我需要相同的代码来执行不同的表单以进行假设

现在Form3我需要实现相同的场景而不是让Form1调用者在Form2我需要创建实例以Form3在调用此表单时创建实例是否可能

Form3 _Form3;
public Form2(Form3 frm)
{
     _Form3 = frm;
}

private void button1_Click(object sender, EventArgs e)
{
  _Form3.UpDateData();
}

我需要根据调用的表单更改调用者

4

6 回答 6

3

使用接口。

public interface IUpdateData
{
  void UpdateData();
}

public class Form1 : Form, IUpdateData {...}
public class Form3 : Form, IUpdateData {...}

public class Form2 : Form
{
  private IUpdateData _parentForm;
  public Form2(IUpdateData _parentForm){...}
  private void btnDelete_Click(object sender, EventArgs e)
  {
    _parentForm.UpdateData();
  }
}

或者您可以创建一个允许报告数据更改并允许订阅接收更改的子系统。

于 2013-07-16T15:27:22.840 回答
2

听起来你需要一个接口

    public interface IUpdateData
    {
      void UpdateData();
    }

    //your forms will all implement the interface
    public class Form2 : Form, IUpdateData
    {
       public void UpdateData()
       {
          //some implementation
       }
    }

    public class Form3 : Form, IUpdateData
    {
       public void UpdateData()
       {
          //some implementation
       }
    }

现在回到你的主窗体,你接受 IUpdateData 的实例

    IUpdateData _form;
    public Form1(IUpdateData frm)
    {
         _form = frm;
    }

现在在单击事件中,您只需调用更新数据方法

    private void button1_Click(object sender, EventArgs e)
    {
      _form.UpdateData();
    }
于 2013-07-16T15:29:30.577 回答
1

使用DialogResultForm2刷新Form3项目Form1

// on Form1
using(var form2 = new Form2(item))
{
   if (form2.ShowDialog() == DialogResult.OK)
   {
        // update items
   }
}

根据用户的操作,Form2将其DialogResult属性设置为等。例如,当用户删除项目时,将结果设置为:DialogResult.OKDialogResult.CancelDialogResult.OK

// on Form2
private void btnDelete_Click(object sender, EventArgs e)
{
    // delete item from db
    DialogResult = DialogResult.OK;
}

更新 - 如果你想保持打开两个表单,那么你不能显示Form2为对话框,上面的代码对你不起作用。您需要声明以下事件Form2

// on Form2
public event EventHandler<ItemDeletedEventArgs> ItemDeleted;

public Form2(List<Item> items)
{
   ...
}

private void btnDelete_Click(object sender, EventArgs e)
{
    // delete item from db
    OnItemDeleted(itemId)
}

protected void OnItemDeleted(int itemId)
{
   if (ItemDeleted == null)
       return;

   ItemDeleted(this, new ItemDeletedEventArgs(itemId));
}

订阅此活动Form1

private void form2_ItemDeleted(object sender, ItemDeletedEventArgs e)
{
    int itemId = e.ItemId;
    // update items
}

ItemDeletedEventArgs继承自的自定义类在哪里EventArgs

public class ItemDeletedEventArgs : EventArgs
{
    public ItemDeletedEventArgs(int itemId);
    {
        ItemId = itemId;
    }

    public int ItemId { get; private set; }
}

如果您不想遵循所有这些 Microsoft 事件类型指南EventHandler、类型参数EventArgs,那么您可以使用简单类型事件Action<int>

public event Action<int> ItemDeleted;

并以这种方式提出:

if (ItemDeleted != null)
    ItemDelted(itemId);
于 2013-07-16T15:14:12.977 回答
0

您可以在基表单类中使用委托。

//Declare public delegate
public delegate void CustomFormEvent(object sender);

// Create a base class 
public partial  class BaseUpdateForm : Form
{
public event CustomFormEvent UpdateData; // Event declaration
protected void CustomFormEventHandler() 
{
    if (this.UpdateData != null)
        UpdateData(this);
}
}

将基类用于任意数量的表单,只需在调用表单或类(所有者)中注册事件。

public partial class ChildForm1 : BaseUpdateForm 
{
public ChildForm1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    CustomFormEventHandler(); 
}
}

在要使用引发事件的所有者表单中:

private void button1_Click(object sender, EventArgs e)
{
    // Form2 or Form3 in your example
    ChildForm1 child1 = new ChildForm1();
    child1.UpdateData += UpdateDataFormEvent;
    child1.Show(); 
}

void UpdateDataFormEvent(object sender)
{
    Form frm = sender as Form; // just cast it back to form
    MessageBox.Show(frm.Text);   
}

它是自定义事件解决方案。

问候。

于 2013-07-16T15:47:54.460 回答
0

你可以做这样的事情

btnShowForm2.click(object sender, EventArgs e)
{
    Form2 frm = new Form2();
    DialogResult dr = frm.ShowDialog();
    if(dr != DialogResult.OK)
        return;

    //call a method to update your data here
    //this way you will reuse this with the other form
}
于 2013-07-16T15:16:43.700 回答
0

为什么不使用发布者\订阅者模式。因此 Form1 订阅来自 Form2 和 Form3 的事件,反之亦然。这是一个更加解耦和灵活的解决方案。

于 2013-07-16T15:32:57.840 回答