2008-11-11 8 views
44

मैं बच्चे से मूल्य को मूल रूप में कैसे पास करूं? मेरे पास एक स्ट्रिंग है जिसे मैं माता-पिता को वापस भेजना चाहता हूं।मैं बच्चे से वापस वैरिटी फॉर्म में मूल्य कैसे पास करूं?

मैं बच्चे का शुभारंभ का उपयोग कर:

FormOptions formOptions = new FormOptions(); 
formOptions.ShowDialog(); 

उत्तर

56

FormOptions पर एक संपत्ति (या विधि) बनाएँ, GetMyResult कहते हैं: यहाँ बिल्ली त्वचा को

using (FormOptions formOptions = new FormOptions()) 
{ 
    formOptions.ShowDialog(); 

    string result = formOptions.GetMyResult; 

    // do what ever with result... 
} 
+0

आप समाधान केवल बंद होने के बाद ही काम करते हैं, माता-पिता के रूप में पासिंग संदेश के बारे में और वापस जब बच्चे का फॉर्म अभी भी खुला रहता है – Smith

0

कई तरीके और @Mitch's suggestion एक अच्छा तरीका है । यदि आप चाहते हैं कि ग्राहक के रूप में अधिक 'नियंत्रण' हो, तो आप माता-पिता के उदाहरण को बच्चे के पास पास कर सकते हैं और फिर आप बच्चे पर किसी भी सार्वजनिक मूल विधि को कॉल कर सकते हैं।

+2

मैं बच्चों के रूपों को यह जानना चाहता हूं कि उन्हें कहां से बुलाया जा रहा है। कम युग्मन ... –

23

आप एक सार्वजनिक संपत्ति भी बना सकते हैं।

// Using and namespace... 

public partial class FormOptions : Form 
{ 
    private string _MyString; // Use this 
    public string MyString {  // in 
     get { return _MyString; } // .NET 
    }       // 2.0 

    public string MyString { get; } // In .NET 3.0 or newer 

    // The rest of the form code 
} 

तो उसे अपने साथ प्राप्त कर सकते हैं: तुम सिर्फ formOptions उपयोग कर रहे हैं किसी एकल मान पास लेने और उसके बाद के लिए

FormOptions formOptions = new FormOptions(); 
formOptions.ShowDialog(); 

string myString = formOptions.MyString; 
+0

erm, क्या मैंने पहले ही कहा नहीं है ?? –

+0

यह वही करता है, बस एक विधि से जुड़ी संपत्ति के साथ। – stiduck

29

, मिच के सुझाव जाने के लिए एक अच्छा तरीका है। मेरा उदाहरण यहां उपयोग किया जाएगा यदि आपको बच्चे को खुले रहते हुए माता-पिता से संवाद करने की आवश्यकता होती है।

अपने माता पिता के रूप में, के रूप में

public void NotifyMe(string s) 
{ 
    // Do whatever you need to do with the string 
} 

अगला एक सार्वजनिक विधि है कि बच्चे प्रपत्र फोन करेगा, इस तरह के जोड़ने जब आप, माता पिता से बच्चे को खिड़की का शुभारंभ इस कोड का उपयोग करने की आवश्यकता है:

using (FormOptions formOptions = new FormOptions()) 
{ 
    // passing this in ShowDialog will set the .Owner 
    // property of the child form 
    formOptions.ShowDialog(this); 
} 

बच्चे रूप में, वापस माता-पिता के लिए एक मूल्य के पारित करने के लिए इस कोड का उपयोग:

ParentForm parent = (ParentForm)this.Owner; 
parent.NotifyMe("whatever"); 

सह इस उदाहरण में डी टूलबॉक्स विंडो जैसी कुछ चीज़ों के लिए बेहतर इस्तेमाल किया जाएगा जिसका उद्देश्य मुख्य रूप से ऊपर फ़्लोट करना है। इस मामले में, आप बच्चे के फॉर्म (.TopMost = true के साथ) का उपयोग करके .how() के बजाय .howDialog() को खोलेंगे।

इस तरह का एक डिज़ाइन इसका मतलब है कि बच्चे का रूप मूल रूप से मूल रूप से जोड़ा जाता है (चूंकि बच्चे को अपने नोटिफ़ाई विधि को कॉल करने के लिए अपने मालिक को पेरेंटफॉर्म के रूप में डालना पड़ता है)। हालांकि, यह स्वचालित रूप से एक बुरी चीज नहीं है।

+0

मैंने आपकी विधि की कोशिश की, हालांकि यह मेरे लिए काम नहीं करता था। यह त्रुटि है मैं माता-पिता को प्राप्त करता हूं। नोटिफ़ाईएम()। क्या आप यह जानने में मदद कर सकते हैं कि क्या गलत हुआ? समारोह माता-पिता में सार्वजनिक है। System.NullReferenceException कोHResult = -2147467261 संदेश = ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं किया गया था। – SLearner

+1

@Shashlearner: मुझे लगता है कि आप 'formOptions.ShowDialog(); 'formOptions.ShowDialog (this) के बजाय' 'को कॉल कर रहे हैं;' जैसा कि मैंने पोस्ट में निर्दिष्ट किया है। यदि आप कॉल में 'यह' पास नहीं करते हैं, तो बच्चे के फॉर्म की 'ओवरर' संपत्ति 'शून्य' होगी और आपको एक शून्य संदर्भ अपवाद मिलेगा। – MusiGenesis

+0

आह। धन्यवाद @MusiGenesis – SLearner

9

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

public partial class FormOptions : Form 
{ 
    public DialogResult ShowDialog(out string result) 
    { 
    DialogResult dialogResult = base.ShowDialog(); 

    result = m_Result; 
    return dialogResult; 
    } 
} 
+1

मुझे यह पसंद है। संवाद खिड़कियां हमेशा मेरे लिए थोड़ा अजीब महसूस करती हैं, क्योंकि आप खिड़की दिखा रहे हैं और फिर इसे खत्म होने के बाद इसकी जानकारी प्राप्त कर रहे हैं। यह दृष्टिकोण खिड़की दिखाता है और जानकारी को एक बार में पुनर्प्राप्त करता है। – MusiGenesis

0

मुझे लगता है कि सबसे आसान तरीका है अपने FormOptions वर्ग टैग = मूल्य और आप उत्तीर्ण करने की आवश्यकता सेट में टैग संपत्ति उपयोग करने के लिए है के बाद ShowDialog विधि

myvalue x=(myvalue)formoptions.Tag; 
+2

मैं उन वर्गों पर टैग का उपयोग नहीं करना चाहता जिन पर मेरा नियंत्रण है (यानी जहां मैं एक संपत्ति जोड़ सकता हूं)। मुझे लगता है कि एक उचित नाम और प्रकार के साथ एक संपत्ति का उपयोग करने के लिए क्लीनर है। –

3

उपयोग सार्वजनिक रूप में पढ़ बच्चे फार्म की संपत्ति

frmOptions { 
    public string Result; } 

frmMain { 
    frmOptions.ShowDialog(); string r = frmOptions.Result; } 

उपयोग घटनाओं

frmMain { 
    frmOptions.OnResult += new ResultEventHandler(frmMain.frmOptions_Resukt); 
    frmOptions.ShowDialog(); } 

उपयोग मुख्य रूप से सार्वजनिक संपत्ति

frmOptions { 
    public frmMain MainForm; MainForm.Result = "result"; } 

frmMain { 
    public string Result; 
    frmOptions.MainForm = this; 
    frmOptions.ShowDialog(); 
    string r = this.Result; } 

उपयोग वस्तु Control.Tag; सार्वजनिक नियंत्रण में सभी नियंत्रणों के लिए यह आम है जिसमें सिस्टम शामिल हो सकता है। ऑब्जेक्ट। आप वहां स्ट्रिंग या माइक्लास या मेनफॉर्म रख सकते हैं - कुछ भी!

frmOptions { 
    this.Tag = "result": } 
frmMain { 
    frmOptions.ShowDialog(); 
    string r = frmOptions.Tag as string; } 
0

आप ShowDialog() या Show() विधि का उपयोग करें, और उसके बाद प्रपत्र बंद करते हैं, प्रपत्र वस्तु पूरी तरह से नष्ट नहीं होता है (समापन! = विनाश)। यह जीवित रहेगा, केवल यह "बंद" राज्य में है, और आप अभी भी चीजें कर सकते हैं।

+0

मुझे लगता है कि आपका मतलब है छुपाएं()। मैं वास्तव में नहीं सोचता कि फ़ॉर्म इसे बंद करने के बाद परिवर्तनों के लिए सक्षम होगा, जब तक कि आप इसे बाहरी रूप से एक्सेस नहीं कर रहे हैं। –

1

Picrofo EDY

यह निर्भर करता है, अगर आप अपने प्रपत्र दिखाने का एक तरीका के रूप में ShowDialog() उपयोग करें और यह बंद करने के लिए आप this.Close() के बजाय बंद करें बटन का उपयोग करें। फॉर्म का निपटान या नष्ट नहीं किया जाएगा, यह केवल छुपा होगा और चले जाने के बाद परिवर्तन किए जा सकते हैं। इसे ठीक से बंद करने के लिए आपको Dispose() या Close() विधि की आवश्यकता होगी। दूसरी तरफ, यदि आप Show() विधि का उपयोग करते हैं और आप इसे बंद करते हैं, तो फॉर्म का निपटारा किया जाएगा और इसके बाद संशोधित नहीं किया जा सकता है।

1

यदि आप एक मोडल डायलॉग बॉक्स के रूप में बाल रूप प्रदर्शित कर रहे हैं, तो आप डायलॉग रेस्यूल्ट गणना से मूल्य के साथ बाल रूप की डायलॉग रीसेट संपत्ति सेट कर सकते हैं जो बदले में मोडल डायलॉग बॉक्स को छुपाता है, और कॉलिंग फॉर्म पर नियंत्रण देता है। इस समय माता-पिता को उस जानकारी को प्राप्त करने के लिए बाल रूप के डेटा तक पहुंच सकते हैं। - हो सकता है थोड़ी अलग http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx

0

खैर मैं बस यहाँ एक ही समस्या का सामना करना है:

अधिक जानकारी के लिए इस लिंक की जाँच करें। हालांकि, मुझे लगता है कि मैंने इसे हल किया है:

  1. मेरे मूल रूप में मैंने उदाहरण के बिना बच्चे का फॉर्म घोषित किया।RefDateSelect myDateFrm; तो यह इस वर्ग/प्रपत्र

  2. अगले भीतर मेरे अन्य तरीकों के लिए उपलब्ध है, एक विधि नया उदाहरण से बच्चे को प्रदर्शित करता है:

    myDateFrm = new RefDateSelect(); 
    myDateFrm.MdiParent = this; 
    myDateFrm.Show(); 
    myDateFrm.Focus(); 
    
  3. मेरी तीसरी विधि (जो बच्चे से परिणाम चाहता है) कर सकते हैं किसी भी समय आ & परिणाम बस मिलती है:

    PDateEnd = myDateFrm.JustGetDateEnd(); 
    pDateStart = myDateFrm.JustGetDateStart();` 
    

    नोट: बच्चे तरीकों JustGetDateStart() के रूप में बच्चे के भीतर सार्वजनिक कर रहे हैं:

    public DateTime JustGetDateStart() 
    { 
        return DateTime.Parse(this.dtpStart.EditValue.ToString()); 
    } 
    

मुझे उम्मीद है कि इससे मदद मिलती है।

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