2008-10-27 9 views
5

से मैं थोड़े इस एक के साथ फंस कर रहा हूँ रिटर्न तो मैं आशा व्यक्त की कोई मुझे मदद कर सकता है।विंडोज फॉर्म्स मॉडल संवाद है कि एक वस्तु नहीं बल्कि DialogResult

मैं एक विनफॉर्म एप्लिकेशन कर रहा हूं और मुझे एक मॉडल डायलॉग (फॉर्म। शोडियलॉग) दिखाने की ज़रूरत है जो एक मान देता है (उपयोगकर्ता को कुछ मूल्यों को संकेत देता है और उन्हें किसी ऑब्जेक्ट में लपेटता है)।

मैं ऑब्जेक्ट में संदर्भ देने या सार्वजनिक रूप से कुछ प्रकार के सार्वजनिक संपत्ति के आधार पर डेटा को पढ़ने के बजाय इसे कैसे नहीं देख सकता।

मैं सिर्फ शोडिअलॉग को कुछ अलग करना चाहता हूं, लेकिन यह काम नहीं करता है। thare कुछ "अच्छा" तरीका यह है है?

मुझे यकीन है कि समस्या नई नहीं है, लेकिन चूंकि लगभग कोई भी Winforms नहीं करता है, इसलिए मुझे वेब पर कोई मार्गदर्शन नहीं मिल रहा है।

उत्तर

12

अपने फ़ॉर्म के एक स्थिर विधि जोड़ें, इस तरह:

public class MyDialog : Form 
{ 
    // todo: think of a better method name :) 
    public static MyObject ShowAndReturnObject() 
    { 
     var dlg = new MyDialog(); 
     if (new dlg.ShowDialog() == DialogResult.OK) 
     { 
      var obj = // construct an instance of MyObject from dlg 
      return obj; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

अब आप thusly अपने कार्यक्रम से कॉल कर सकते हैं:

var myObject = MyDialog.ShowAndReturnObject(); 

... और अगर वे संवाद, myObject रद्द शून्य हो जाएगा

अब, यह सब कहकर, मुझे विश्वास है कि आपके फॉर्म के वर्ग में एक संपत्ति जोड़कर जिसे आप ShowDialog() को कॉल करने के बाद पढ़ते हैं, बेहतर दृष्टिकोण है।

+0

Dammit :) यही कारण है कि लगभग ठीक है कि मैं क्या था है (सिवाय मैं अपने विधि ShowDialog कहा जाता है -? और क्यों नहीं)। –

+0

ओह, और यदि आप कोड ब्लॉक को इंडेंट करते हैं, तो यह आपके लिए सिंटैक्स रंग होगा ... –

+0

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

0

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

2

आप संवाद है कि लौटने मूल्य का प्रतिनिधित्व करता अंदर एक सार्वजनिक संपत्ति बना सकते हैं:

/* Caller Code */ 
var dlg = new MyDialog(); 
if(dlg.ShowDialog() == DialogResult.OK) 
    MessageBox.Show(dlg.MyResult); 

/* Dialog Code */ 
public string MyResult { get { return textBox1.Text; } } 

private void btnOk_Click(object sender, EventArgs e) 
{ 
    DialogResult = System.Windows.Forms.DialogResult.OK; 
    this.Close(); 
} 
0

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

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