2013-01-04 74 views
2

我看到很多頁面和涉及將值從一個表單傳遞到另一個表單的問題。我想做一些有點不同的事情。不是值,而是整個表單,作爲參數傳遞。請不要這不是一個MDI表格。將完整的子表單傳遞給另一個子表單

我有一個有2個按鈕的父窗體。一個按鈕創建一個Child1窗體等等。另一個(可選)按鈕調用另一個子窗體編輯器。

第一個按鈕是一個驗證按鈕,如果有效的話,調出一個帶有鍵/值對的listviewbox的Child1表單。 第二個是帶有自己按鈕的編輯器。如果其中一個(提交)按鈕被按下,則第一個Child1表單應該用一個新的keyvaluepair進行更新。

我一直有的問題是,我似乎無法得到Child1窗體來反映更改。我不知道更新此Child1表單的最佳方法是什麼。我已經用EndUpdate嘗試了BeginUpdate,並刷新它,現在嘗試了所有嘗試,我已經有點失落了。我希望有一個人可以幫助我。

我實際上想要做的是刷新ChildForm1,當收件箱被「保存」或從第二個子窗體編輯器添加時,將其稱爲收件箱。在第二個childform編輯器中點擊按鈕,第一個Childform應該刷新。

父窗體:

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); 
      } 
     } 
    } 

EditorForm:

private ChildForm1 originalForm = new ChildForm1(); 

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

我敢肯定,這是很容易的,但我不能得到它。如果有人能幫助它,將不勝感激,節省我的時間!如果有更好的方式來更新提交結果也很好,請舉個例子嗎?

出於測試目的,我爲ChildForm1創建了一個「刷新」按鈕,它的工作原理! (它實際上只是調用updateMe(),所以這是一個奇怪的東西,我認爲我正在創建一個新的窗體實例,並試圖改變這個不存在的(空)窗體而不是實際的ChildForm1,但是我想刷新listviewBox從出編輯表格。

回答

0

我建議不從另一個更新一個形式,而是具有存儲在一個對象就像一個視圖模型的工作數據,並始終從刷新您的形式。

看一看的MVP模式這對於WinForms的應用是有用的。

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

+0

這是正確的鏈接嗎?我沒有看到關於MVP的任何信息 – SuusvdVen

1

而不是讓Editor成爲父窗體的「子」形式,使其成爲子窗體ChildForm(又名父母的孫子)。當然,因爲你沒有使用MDI,所以這只是解決問題的一種合理方式,沒有什麼更多。

不是讓父母創建Editor,而是讓ChildForm創建它。當父窗體的第二個按鈕被點擊時,它會調用ChildFormCreateEditor。當它創建編輯器時,它顯然可以存儲它以便以後進行交互。

如果父表單需要對Editor執行其他任何操作,則可以通過ChildForm來執行此操作。

+0

好的,很好的建議。 (覺得愚蠢的不去想它)但現在主窗體只有驗證按鈕,當點擊時創建ChildForm1。 ChildForm1現在有了創建編輯器的按鈕。仍然是一個問題......我無法從編輯器窗體中刷新listviewbox。我不認爲調用可用的刷新按鈕就是這樣嗎? ;) – SuusvdVen

+0

@SuusvdVen正如我在我的回答中所說的,主窗體仍然可以有創建「編輯器」的按鈕,它只是「通過子窗體」。主窗體調用子窗體的方法,子窗體創建編輯器。至於如何將信息從編輯器傳遞給父母,只需做與父母和孩子之間始終進行通信的相同的事情,然後執行兩次。讓編輯將信息傳遞給孩子,孩子將信息傳遞給父母。這將通過兩個事件完成。編輯提出了一個子表單用來提高另一個的事件。 – Servy

+0

主(父)表單不需要使用編輯器,所以這就是爲什麼我把它放在ChildForm1中。我仍然無法從ChildForm1獲取基於編輯器的更新列表視圖。我目前正試圖弄清楚我是否應該使用代表。但是,謝謝。 – SuusvdVen

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; 
    } 
} 

其實很簡單,但並沒有馬上看到它。我讓它變得比與代表們一樣需要更復雜。這很簡單,它似乎適用於我。

相關問題