1

こんにちは、アプリケーションに 3 つのフォームがあります。form1 にはデータベースからのデータが表示add/editされ、ユーザーが選択したオプションに対応するボタンが表示されます。Form2 と Form3 をロードします。Form1ユーザーがいずれかのフォームで保存をクリックした後、データを更新したいと思いますForm2, Form3

通常、1 つのインスタンスについて次のように記述します。

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

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

しかし、仮定のために異なるフォームに対して実行するには同じコードが必要です

ここで、同じシナリオを実装する必要がありますCallerを使用Form3する代わりに、このフォームが呼び出されたときにインスタンスを作成する必要がありますForm1Form2Form3

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

とを使用してDialogResultの項目を更新:Form2Form3Form1

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

ユーザーのアクションに応じて、プロパティを などに設定しますForm2。たとえば、ユーザーがアイテムを削除した場合、結果を次のように設定します。DialogResultDialogResult.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; }
}

EventHandlertype のイベント、 typeの引数に関するこれらすべての Microsoft ガイドラインに従いたくない場合は、EventArgstype の単純なイベントを使用できます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 に答える