2

あるフォームから別のフォームに値を渡すことに関する多くのページと質問を目にします。少し違うことをしたいと思います。値ではなく、パラメーターとして渡されるフォーム全体。これは MDI フォームではないことに注意してください。

私は2つのボタンを持つ親フォームを持っています。1 つのボタンで、とりわけ Child1 フォームが作成されます。別の (オプションの) ボタンは、別の子フォーム エディターを呼び出します。

最初のボタンは検証ボタンで、有効な場合、キーと値のペアで満たされたリストビュー ボックスを含む Child1 フォームを表示します。2 つ目は、独自のボタンを備えたエディターです。これらの (送信) ボタンのいずれかが押された場合、最初の Child1 フォームが新しいキーと値のペアで更新されます。

私が抱えていた問題は、変更を反映するために Child1 フォームを取得できないように見えることです。この Child1 フォームを更新する最善の方法がわかりません。私は EndUpdate で BeginUpdate を試し、それを更新しましたが、すべての試行で少し迷ってしまいました。誰かが私を助けてくれることを願っています。

私が実際にやりたいのは、何かが「保存」または2番目の子フォームエディターから追加されたときに、受信トレイだと言って、ChildForm1を更新することです。この 2 番目の子フォーム エディターでボタンをクリックすると、最初の子フォームが更新されます。

親フォーム:

    public ChildForm1 MyboxofValues; 

    private void btn1_Click(object sender, EventArgs e)
    {
            MyboxofValues = new ChildForm1();
            MyboxofValues.Show();
    }

    private void btn2_Click(object sender, EventArgs e)
    {
        Editor myEditor = new Editor();
        myEditor.Show(); 
    }

ChildForm1:

    public ChildForm1()
    {
        InitializeComponent();
        updateMe();

    }
    public void updateMe()
    {
        listView1.Items.Clear();
        if (MainCode.subRows.Count > 0)
        {
            foreach (KeyValuePair<string, string> element in MainCode.subRows)
            {
                ListViewItem lvi = new ListViewItem(element.Value);
                lvi.SubItems.Add(element.Key);
                listView1.Items.Add(lvi);
            }
        }
    }

エディタフォーム:

    private ChildForm1 originalForm = new ChildForm1();

    private void btnSubmit_Click(object sender, EventArgs e)
    {
            originalForm.updateMe();
    }

とても簡単だと思いますが、手に入りません。誰かがそれを手伝ってくれるなら、私に時間を節約してください! 提出結果を更新するより良い方法があれば、例を示してください。

テスト目的で、動作する ChildForm1 の「更新」ボタンを作成しました。(実際にはupdateMe()を呼び出すだけです。フォームの新しいインスタンスを作成し、実際のChildForm1の代わりにこの存在しない(null)フォームを変更しようとしていると思います。しかし、リストビューボックスをリフレッシュしたいエディターフォームから。

4

3 に答える 3

1

Editor親フォームの「子」フォームにするのではなく、子フォーム(ChildForm別名、親の孫) にします。もちろん、MDI を使用していないので、これは問題にアプローチするための論理的な方法に過ぎず、それ以上のものではありません。

親に を作成させるのEditorではなく、ChildForm作成させます。親フォームの 2 番目のボタンがクリックされると、 of のようなメソッドが呼び出されCreateEditorますChildForm。エディターを作成すると、後で対話するためにそれを保存できます。

親フォームが で何か他のことをする必要がある場合は、Editorを経由しChildFormて実行できます。

于 2013-01-04T15:15:53.653 に答える
0

主にServyからの知覚的な助けを通して。これが他の誰かに役立つかどうかはわかりません。

親フォームである MyBox は、以前は ChildForm1 であると最初に考えていた方法によるものです。

  public MyBox()
    {
        InitializeComponent();
        updateMe();
    }
    public void updateMe()
    {
        listView1.Items.Clear();
        if (MainCode.subRows.Count > 0)
        {
            foreach (KeyValuePair<string, string> element in MainCode.subRows)
            {
                ListViewItem lvi= new ListViewItem(element.Value);
                lvi.SubItems.Add(element.Key);
                listView1.Items.Add(lvi);
            }
        }
    }
    private void btnCreateEditor_Click(object sender, EventArgs e)
    { 
        plainTextEditor editor = new plainTextEditor(this);
        Form1.editorOpen = true;
        editor.Show(this);
    }

このフォームには、次のようなエディタ フォームを呼び出すボタンがあります。

public partial class Editor : Form
{
    private MyBox listviewBoxForm;

    public Editor(listviewBoxForm _form1)
    {
        InitializeComponent();
        inboxForm = _form1;
    }
 }

実際には単純ですが、すぐにはわかりませんでした。デリゲートなどで必要以上に複雑にしていました。これは簡単で、うまくいくようです。

于 2013-01-04T16:41:45.370 に答える
0

あるフォームを別のフォームから更新するのではなく、作業データをビューモデルのようなオブジェクトに保存し、常にそこからフォームを更新することをお勧めします。

WinForms アプリケーションに役立つ MVP パターンをご覧ください。

http://martinfowler.com/eaaDev/ModelViewPresenter.html

于 2013-01-04T15:14:43.037 に答える