2011-05-13 43 views
7

我有兩個Windows窗體(MyApp的,發電機),我需要從MyApp的在C#Windows窗體之間的返回結果

調用發電機
Form gen = new Generator(); 
gen.Show(); 
string result = gen.IDontKnowWhatToDoHere(); 

我Generator.cs形式有三個文本框和一個Button好了,當用戶在三個文本框中鍵入一些文本時,單擊確定我想獲得在這三個文本框中鍵入的文本。

你有什麼想法,我可以做到這一點。

謝謝。

+0

Ok按鈕是否會關閉窗體? – 2011-05-13 09:05:06

+0

我認爲是的,它會做:this.Close(),但我不能調用onClose事件? – 2011-05-13 09:16:11

+0

你需要模態對話框嗎?這意味着調用代碼將等待顯示錶單關閉。 – 2011-05-13 09:27:41

回答

6
class Generator : Form 
{ 
    public string Text1 { get; private set; } 

    void ok_Click (object sender, EventArgs) 
    { 
     this.Text1 = txt1.Text; 
     ... 
     this.Close(); 
    } 
} 

Form gen = new Generator(); 
gen.ShowDialog(); 
string text1 = gen.Text1; 
... 

class TextInfo 
{ 
    public string Text1 { get; set; } 
    ... 
} 

class Generator : Form 
{ 
    public TextInfo Textinfo { get; private set; } 

    public Generator(TextInfo info) 
    { 
     this.TextInfo = info; 
    } 

    void ok_Click (object sender, EventArgs) 
    { 
     this.TextInfo.Text1 = txt1.Text; 
     ... 
     this.Close(); 
    } 
} 

TextInfo info = new TextInfo(); 
Form gen = new Generator(info); 
gen.ShowDialog(); 
string text1 = info.Text1; 
+0

我這樣做,但文本1 =「」因爲MyApp的形式不等待發電機形式發送數據,因此text1爲空。 – 2011-05-13 09:08:35

+0

如何讓MyApp在繼續執行之前等待Generator窗體關閉? – 2011-05-13 09:09:22

+2

你應該使用Form.ShowDialog而不是From.Show – 2011-05-13 09:32:27

1
Form gen = new Generator(); 
gen.ShowDialog(); 
string result = gen.IDontKnowWhatToDoHere(); 

但我認爲更有生力量已創建委託。

0

IF發生器是一種形式,所以它從表繼承,行更改爲:

Generator gen = new Generator(); 
gen.Show(); 
string result = gen.SomePublicVariableOrProperty; 
+0

string result = gen。SomePublicVariableOrProperty;這應該被稱爲onclose事件的生成器 – Gabriel 2011-05-13 08:55:23

+0

你需要showdialog而不是顯示。或者使用OnClose事件(Gabrield所說的) – RvdK 2011-05-13 09:08:36

0

我想你可以通過當前表單實例作爲參數傳遞給Generator形式的構造函數嘗試。

點擊事件填寫完Textbox之後,通過在構造函數中傳遞的實例的幫助將其分配給主窗體中的屬性。

Form gen = new Generator(this); 
gen.Show(); 

public Generator(Form F1) 
{ 
    InitializeComponent(); 
    form1 = F1 as ParentForm; // now you have parent reference 
} 

按鈕單擊Generator形式的

form1.Somproperty分配值

希望這有助於

8

我一般都採用這種模式:

TResult result = Generator.AskResult(); 

class Generator : Form 
{ 
    // set this result appropriately 
    private TResult Result { get; set; } 
    public static TResult AskResult() 
    { 
     var form = new Generator(); 
     form.ShowDialog(); 
     return form.Result; // or fetch a control's value directly 
    } 
} 

此MA kes在單個語句中工作,類似於MessageBox,並且不需要公開任何控件。您還可以將任何其他數據作爲參數包含在靜態方法中,並將它們傳遞給窗體的構造函數或適當地設置屬性。

另一個好處包括能夠在需要時重用表單的實例。

2

如果您需要無模式表單中的數據,則應使用事件或其他通知模式。

class OkPressedEventArgs : EventArgs 
{ 
    public OkPressedEventArgs(string text1, string text2, string text3) 
    { 
     Text1 = text1; 
     Text2 = text2; 
     Text3 = text3; 
    } 

    public string Text1 {get;private set;} 
    public string Text2 {get;private set;} 
    public string Text3 {get;private set;} 
} 

class SourceForm : Form 
{ 
    public event EventHandler<OkPressedEventArgs> OkPressed; 
    private void OnOkPressed() 
    { 
     if(OkPressed != null) 
     { 
      OkPressed(this, new OkPressedEventArgs(textBox1.Text, textBox2.Text, textBox2.Text); 
     } 
    } 

    private void okButton_Click(object source, EventArgs e) 
    { 
     OnOkPressed(); 
    } 
} 

class TargetClass 
{ 
    void ShowFormMethod() 
    { 
     var form = new SourceForm(); 
     form.OkPressed += OkPressedHandler; 
     form.Show(); 
    } 

    private void OkPressedHandler(object source, OkPressedEventArgs e) 
    { 
     // process form data here! 
    } 
} 
+0

這應該是答案,因爲它明確地闡明瞭如何使用非模態窗體,這就是您使用Form.Show()所做的,就像OP所做的那樣。 – Ant 2017-09-21 16:22:57