2011-05-13 13 views
7

मैं दो Windows Forms (MyApp, जेनरेटर) है, और मुझे वापसी परिणाम

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

मेरे Generator.cs फार्म तीन पाठ बॉक्स और एक बटन ठीक है तो, MyApp

से जेनरेटर कॉल करने की आवश्यकता जब उपयोगकर्ता तीन टेक्स्टबॉक्स में कुछ टेक्स्ट टाइप करता है तो एक क्लिक ठीक है, मैं उन तीन टेक्स्टबॉक्स में टाइप किए गए टेक्स्ट को प्राप्त करना चाहता हूं।

क्या आपके पास कोई विचार है कि मैं इसे कैसे प्राप्त कर सकता हूं।

धन्यवाद।

+0

क्या ओके बटन फॉर्म बंद हो जाएगा या नहीं? –

+0

मुझे लगता है कि यह हाँ करेगा: यह। बंद करें(), लेकिन मैं ऑनक्लोज़ इवेंट का आह्वान नहीं कर सकता? –

+0

क्या आपको मोडल डायलॉग की आवश्यकता है? इसका मतलब यह है कि कॉल कोड तब तक इंतजार करेगा जब तक कि शो बंद नहीं हो जाता। –

उत्तर

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 फॉर्म जेनरेटर फॉर्म को डेटा भेजने के लिए इंतजार नहीं कर रहा है, इसलिए टेक्स्ट 1 खाली है। –

+0

मैं MyApp को जेनरेटर फॉर्म को निष्पादन जारी रखने से पहले बंद करने के लिए कैसे कर सकता हूं? –

+2

आपको फॉर्म के बजाय Form.ShowDialog का उपयोग करना चाहिए। –

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

लेकिन मुझे लगता है कि और अधिक और अफ़सर गया प्रतिनिधि पैदा करते हैं।

0

यदि जेनरेटर एक रूप है तो यह फार्म से विरासत, करने के लिए लाइन बदलने के लिए:

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

स्ट्रिंग परिणाम = जीन।SomePublicVariableOrProperty; इसे जेनरेटर – Gabriel

+0

पर लॉस इवेंट पर कॉल किया जाना चाहिए आपको शोडियलॉग की आवश्यकता है और नहीं दिखाएं। या ऑनक्लोज़ इवेंट (गैब्रिल्ड क्या कहता है) का उपयोग करें – RvdK

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

इस मा केएस यह एक संदेश बॉक्स के समान, एक ही कथन में काम करता है, और किसी भी नियंत्रण को सार्वजनिक करने की आवश्यकता नहीं है। आप स्थिर विधि के पैरामीटर के रूप में कोई भी अतिरिक्त डेटा भी शामिल कर सकते हैं और उन्हें फॉर्म के कन्स्ट्रक्टर में पास कर सकते हैं या उचित रूप से गुण सेट कर सकते हैं।

अन्य लाभों में आवश्यकता होती है, यदि आवश्यकता उत्पन्न होती है, तो फॉर्म के उदाहरणों का पुन: उपयोग करें।

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

यह उत्तर होना चाहिए क्योंकि यह स्पष्ट रूप से स्पष्ट करता है कि गैर-मोडल रूपों के साथ क्या करना है, जो आप ओपी के रूप में फॉर्म.शो() के लिए उपयोग करते हैं। – Ant

संबंधित मुद्दे