2010-09-21 8 views
11

संपादित करें: यह विधि वास्तव में बहुत अच्छा काम करती है और मैंने उससे पूछा कि बाद में समाधान मिला। मैं अतिभारित ShowDialog में सही कॉल() विधि जोड़ा (यह exacly एक अधिभार, या यहाँ तक कि एक ओवरराइड नहीं है, लेकिन यह सिर्फ एक ही काम करता है। मेरा नया सवाल तल पर एक है।क्या फॉर्म के लिए ShowDialog विधि को अधिभारित करना और एक अलग परिणाम लौटना संभव है?

मैं एक रूप है ।।

MyFormResults res = MyForm.ShowDialog(); 

मैं इस कोड के साथ एक नया ShowDialog विधि जोड़ सकते हैं: जिसमें आप तीन बटनों पर क्लिक करें मैं लौट आए परिणामों के लिए एक enum को परिभाषित किया है मैं कॉल करनी है

public new MyFormResults ShowDialog() 
{ 
    //Show modal dialog 
    base.ShowDialog(); //This works and somehow I missed this 

    return myResult; //Form level variable (read on) 
} 

जब मैं परिणाम के लिए एक फॉर्म-स्तरीय चर सेट करता हूं बटन क्लिक किया जाता है:

MyFormResults myResult; 

private void btn1_click(object sender, EventArgs e) 
{ 
    myResult = MyFormsResults.Result1; 
    this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call? 
    this.Close(); //Should I close the dialog here or in my new ShowDialog() function? 
} 

//Same as above for the other results 

केवल एक चीज मैं याद कर रहा हूँ संवाद (मोडल) को दिखाने के लिए और फिर मेरी परिणाम वापसी कोड है। base.ShowDialog() फ़ंक्शन नहीं है, तो मैं यह कैसे कर सकता हूं?

संपादित करें: एक 'base.ShowDialog()' है और यह काम करता है। यह मेरा नया प्रश्न यहां है:

साथ ही, यह सब करने का यह सबसे अच्छा तरीका है और क्यों?

धन्यवाद।

+0

ठीक है, बहुत शर्मिंदा है, लेकिन एक "आधार है।ShowDialog() "और यह ठीक काम करता है। मैं" this.base.ShowDialog() "का प्रयास कर रहा था। यह पूरी तरह से काम करता है। –

उत्तर

10

संपादित करें: ShowDialog() की कार्यक्षमता को बदलने के लिए यह एक अच्छा विचार नहीं है, लोगों को यह DialogResult वापस करने की उम्मीद है और फॉर्म दिखाएं, मैं नीचे दिए गए सुझावों की तरह कुछ सुझाव देता हूं। इस प्रकार, अभी भी ShowDialog() को सामान्य तरीके से उपयोग करने की अनुमति है।

आप की तरह DoShowGetResult()

कुछ जो इस

public static MyResultsForm DoShowGetResult() 
{ 
    var f = new MyForm(); 
    if(f.ShowDialog() == DialogResult.OK) 
    { 
     return f.Result; // public property on your form of the result selected 
    } 
    return null; 
} 

कुछ ऐसा दिखाई देगा अपने MyForm पर एक स्थिर विधि बना सकते हैं, तो आप इस

MyFormsResult result = MyForm.DoShowGetResult(); 
0

ShowDialog विधि का उपयोग कर सकते हैं नहीं कर सकते overriden हो। आप इंटैड क्या कर सकते हैं हालांकि एक नई विधि बनाई गई है जो ShowDialog परिणाम और दूसरा मान दोनों देता है।

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
    var dialogRet = ShowDialog(); 
    result = MyFormResults.Result1; 
    return dialogRet; 
} 
1

नहीं, यह संभव नहीं है। हमेशा की तरह वैकल्पिक हल फार्म पर एक संपत्ति के रूप में अपने वास्तविक परिणाम बेनकाब करने के लिए है:

pubic MyFormResults MyResult 
{ 
    get; 
} 

और आप इस सेट होगा:

private void btn1_click(object sender, EventArgs e) 
{ 
    MyResult = MyFormsResults.Result1; 
    this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call? 
    this.Close(); //Should I close the dialog here or in my new ShowDialog() function? 
} 

और बुला कोड आमतौर पर इस तरह दिखता है:

if (form.ShowDialog == DialogResult.OK) 
{ 
    //do something with form.MyResult 
} 
3

इसे आज़माएं, ऐसा लगता है कि यह मेरे लिए काम करता है:

public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     public DialogResult ShowDialog(string mes) 
     { 
      this.textBox1.Text = mes; 
      return base.ShowDialog(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 
    } 
संबंधित मुद्दे