2010-03-23 8 views
54

मेरे पास एक संवाद है जो मैं <class>.ShowDialog() के साथ दिखाता हूं। इसमें एक ठीक बटन और एक रद्द बटन है; ओके बटन में एक ईवेंट हैंडलर भी है।बटन के क्लिक ईवेंट हैंडलर में बंद होने से एक संवाद को रोकना

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

उत्तर

38

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

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    // Determine if text has changed in the textbox by comparing to original text. 
    if (textBox1.Text != strMyOriginalText) 
    { 
     // Display a MsgBox asking the user to save changes or abort. 
     if(MessageBox.Show("Do you want to save changes to your text?", "My Application", 
     MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
     // Cancel the Closing event from closing the form. 
     e.Cancel = true; 
     // Call method to save file... 
     } 
    } 
} 

e.Cancel = true सेट करके आप फॉर्म को बंद होने से रोक देंगे।

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

+4

जो काम करेगा ... लेकिन भयानक UI अभ्यास होगा। ओपी पहले ही एक संवाद दिखा चुका है, फिर आप फेंक देते हैं! मौजूदा विनफॉर्म सत्यापन तकनीकों का उपयोग करने के लिए बहुत बेहतर 'ओके' बटन – Adrian

+2

@ एड्रियन अक्षम करें - मैंने "एक तरफ" कहा था;)। यह सब इस बात पर निर्भर करेगा कि त्रुटि कितनी संभावित और/या गंभीर थी। अंतिम निर्णय लेने से पहले मुझे फॉर्म का डिज़ाइन देखना होगा। – ChrisF

+0

सहमत हुए और मैंने अभी ओपी को पढ़ा है और देखा है कि वह पॉप अप करने के लिए एक गंभीर संवाद चाहता था! – Adrian

0

उपयोगकर्ता शायद ओके बटन हिट करने से पहले फॉर्म को चेक कर सकते हैं। यदि यह कोई विकल्प नहीं है, तो एक संदेश बॉक्स खोलें जिसमें कुछ गलत है और पिछले राज्य के साथ फ़ॉर्म को फिर से खोलें।

+0

आप शायद विधि देख सकते हैं इससे पहले कि उपयोगकर्ताओं को ठीक बटन हिट में एक पंक्ति जोड़ें -> कब? मैं केवल तभी जांच सकता हूं जब वे "सबमिट" करने की कोशिश करते हैं (वेब ​​की शब्दावली उधार लेते हैं), अन्यथा यह अमान्य होगा क्योंकि उपयोगकर्ता को इसे पहले भरने का मौका नहीं मिला है। आपका दूसरा सुझाव लागू करना काफी मुश्किल है; मैं कुछ आसान (या जो करने की कोशिश कर रहा हूं उसे करने का एक अलग तरीका) की उम्मीद कर रहा था – qster

2

आप फॉर्मक्लोज़िंग को पकड़ सकते हैं, वहां फॉर्म को खोलने के लिए मजबूर कर सकते हैं। उस के लिए ईवेंट तर्क ऑब्जेक्ट की रद्द करें संपत्ति का उपयोग करें।

e.Cancel = true; 

और इसे आपके फॉर्म को बंद होने से रोकना चाहिए।

4

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

+0

ठीक है, हाँ, मैंने इसके बारे में सोचा था, लेकिन जब किसी विशेष इनपुट में एक अमान्य मान होता है तो यह स्पष्ट रूप से लाल पृष्ठभूमि के साथ चिह्नित होता है .. मुझे लगता है कि बटन को अक्षम करने के लिए यह छोटा है, अगर मुझे लगता है कि यह लागू करने के लिए छोटा है, मुझे लगता है, और करने के लिए कोई नीचे नहीं है यह – qster

+0

इस दृष्टिकोण के साथ समस्या यह है कि अधिक जटिल रूपों के लिए यह उपयोगकर्ता के लिए स्पष्ट नहीं हो सकता है कि बटन को फिर से सक्षम करने के लिए उन्हें क्या करना है। इस प्रकार की ऑन-द-फ्लाई सत्यापन अन्य चीजों के साथ बेहतर काम करेगी, जैसे कि त्रुटिप्रदाता आदि। – dreamlax

0

मेरी इच्छा है कि मेरे पास एक बेहतर उदाहरण खोजने का समय हो, लेकिन आप ऐसा करने के लिए मौजूदा विंडोज़ फॉर्म सत्यापन तकनीकों का उपयोग करना बंद कर देंगे।

http://msdn.microsoft.com/en-us/library/ms229603.aspx

12

इस के लिए FormClosing घटना का उपयोग न करें, आप उपयोगकर्ता के साथ या तो रद्द या एक्स पर क्लिक आप ठीक बटन की क्लिक ईवेंट हैंडलर और डॉन 'को लागू संवाद निरस्त करने की अनुमति चाहता हूँ जब तक आप खुश न हों:

private void btnOk_Click(object sender, EventArgs e) { 
    if (ValidateControls()) 
    this.DialogResult = DialogResult.OK; 
} 

जहां "मान्यडेट्रोल" आपका सत्यापन तर्क है। कुछ गलत होने पर झूठी वापसी करें। इस कोड को

+0

एक मामूली विस्तार - ऐसा लगता है कि आपने डायलॉग रेसल्ट निर्दिष्ट नहीं किया है: ओके के डिज़ाइन-टाइम सेटअप के हिस्से के रूप में ठीक है बटन। – RenniePet

+1

फिर आप उलटा करते हैं, सत्यापन विफल होने पर इसे किसी भी पर सेट नहीं करते हैं। –

3

उपयोग:

private void btnOk_Click(object sender, EventArgs e) { 
    if (ValidateControls()) 
    this.DialogResult = DialogResult.OK; 
} 

यह समस्या उपयोगकर्ता रूपों बंद करने के लिए दो बार बटन CLIC है कि है,

121

आप फॉर्म का DialogResultDialogResult.None पर सेट करके बंद कर सकते हैं।

एक उदाहरण जहां Button1 AcceptButton है:

private void button1_Click(object sender, EventArgs e) { 
    if (!validate()) 
    this.DialogResult = DialogResult.None; 
} 

उपयोगकर्ता क्लिक करता है Button1 और सत्यापित करें विधि झूठी देता है, प्रपत्र बंद कर दिया नहीं किया जाएगा।

+0

फिर भी 'else DialogResult = DialogResult.OK' जोड़ने के लिए आवश्यक नहीं होगा ताकि जब वे अपनी त्रुटियों को ठीक कर सकें और अगली बार डायलॉग परिणाम ठीक से सेट हो जाए तो ठीक है? – krillgar

+1

क्योंकि AcceptButton बटन 1 है, डायलॉग रेसल्ट हमेशा क्लिक होने पर DialogResult.OK पर सेट होता है। – Arjan

+1

ओह ठीक है। यह वास्तव में बटन के DialRResult को ओवरराइड नहीं करता है, बस इसे तर्क की उस शाखा में बदल देता है। – krillgar

0

बस घटना समारोह

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 
      { 
       this->DialogResult = System::Windows::Forms::DialogResult::None; 
      } 
0
void SaveInfo() 
{ 
blnCanCloseForm = false; 
Vosol[] vs = getAdd2DBVosol(); 
if (DGError.RowCount > 0) 
return; 

Thread myThread = new Thread(() => 
{ 
this.Invoke((MethodInvoker)delegate { 
    picLoad.Visible = true; 
    lblProcces.Text = "Saving ..."; 
}); 
int intError = setAdd2DBVsosol(vs); 
Action action = (() => 
{ 
    if (intError > 0) 
    { 
     objVosolError = objVosolError.Where(c => c != null).ToArray(); 
     DGError.DataSource = objVosolError;// dtErrorDup.DefaultView; 
     DGError.Refresh(); 
     DGError.Show(); 
     lblMSG.Text = "Check Errors..."; 
    } 
    else 
    { 
     MessageBox.Show("Saved All Records..."); 
     blnCanCloseForm = true; 
     this.DialogResult = DialogResult.OK; 
     this.Close(); 
    } 

}); 
this.Invoke((MethodInvoker)delegate { 
    picLoad.Visible = false; 
    lblProcces.Text = ""; 
}); 
this.BeginInvoke(action); 
}); 
myThread.Start(); 
} 

void frmExcellImportInfo_FormClosing(object s, FormClosingEventArgs e) 
{ 
    if (!blnCanCloseForm) 
     e.Cancel = true; 
} 
संबंधित मुद्दे