मेरे पास एक संवाद है जिसे मैं ठीक बटन क्लिक करने पर बंद होने से रोकना चाहता हूं, लेकिन यह लौटाता है, और यह भी कि अगर AcceptButton प्रॉपर्टी मेरे बजाय किसी के लिए सेट नहीं है ठीक बटन इसे बंद करने से रोकने का सबसे अच्छा तरीका क्या है?ओके बटन पर क्लिक होने पर लौटने से ShowDialog() को रोकें
उत्तर
वास्तव में आप गलत संपत्ति बदल रहे हैं। ठीक है बटन होने के लिए आप निश्चित रूप से AcceptButton
चाहते हैं। यह संपत्ति निर्धारित करता है कि विंडोज़ शर्तों में डिफ़ॉल्ट बटन कौन सा है। वह बटन है जिसे दबाया जाता है जब आप अपने कीबोर्ड पर दबाते हैं। AcceptButton
बदलकर आप बस अपने संवाद में कीबोर्ड इंटरफ़ेस तोड़ रहे हैं। बटन दबाए जाने पर आप किसी भी तरह से प्रभावित नहीं होते हैं।
आपको क्या करना है DialogResult
DialogResult.None
पर अपने बटन की संपत्ति सेट करें क्योंकि यह निर्धारित करता है कि कोई बटन प्रेस फॉर्म को बंद करता है या नहीं। फिर, बटन के क्लिक हैंडलर के अंदर आपको यह तय करने की आवश्यकता है कि बटन प्रेस का जवाब कैसे दिया जाए। मैं उम्मीद करता हूं कि, यदि संवाद की मान्यता सफल होती है, तो आपको फॉर्म की DialogResult
संपत्ति सेट करके संवाद बंद करना चाहिए। उदाहरण के लिए
private void OKbuttonClick(object sender, EventArgs e)
{
if (this.CanClose())
this.DialogResult = DialogResult.OK;
}
आपको बटन के DialogResult
को भी बटन को हटाने की आवश्यकता है, बटन पर गुण विंडो में इसे None
पर सेट करें।
http://msdn.microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx
इस संपत्ति के लिए DialogResult कोई नहीं के अलावा और कुछ करने के लिए सेट कर दिया जाता है, और अगर माता-पिता प्रपत्र ShowDialog विधि के माध्यम से प्रदर्शित किया गया था, बटन पर क्लिक करें अपने होने बिना माता पिता के रूप बंद कर देता है, तो किसी भी घटना को हुक करने के लिए।
जाहिर है, अब आपका बटन कुछ भी नहीं करेगा, इसलिए आपको Click
ईवेंट के लिए एक हैंडलर पंजीकृत करने की आवश्यकता होगी।
इस व्यवहार को रोकने का सबसे अच्छा तरीका डिज़ाइन समय पर प्रॉपर्टी विंडो में DialogResult.None
पर अपने ठीक बटन की डायलॉग रीसेट संपत्ति बदल रहा है।
इसके अलावा, यदि आपके पास ठीक बटन के क्लिक ईवेंट में पहले से ही कुछ कोड है तो आप DialogResult फॉर्म बदल सकते हैं।
private void comOK_Click(object sender, EventArgs e)
{
// your code .....
// Usually this kind of processing is the consequence of some validation check that failed
// so probably you want something like this
if(MyValidationCheck() == false)
{
// show a message to the user and then stop the form closing with
this.DialogResult = DialogResult.None;
}
}
सबसे अच्छा अभ्यास वास्तव में ओके बटन को अक्षम करने के बजाय उपयोगकर्ता इनपुट का जवाब देने के लिए सेट करना है।
डायलॉग रीसेट संपत्ति को फॉर्म के आधार पर ठीक या हां पर सेट किया जाना चाहिए और AcceptButton को ओके से भी जोड़ा जाना चाहिए।
मैं आम तौर पर सभी संवादों पर एक फ़ंक्शन बनाता हूं और जब भी उपयोगकर्ता डेटा के साथ इंटरैक्ट करता है उसे कॉल करता है।
void RefreshControls() { button.Enabled = this.ValidateInput(); }
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form2 fLogin = new Form2();
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new Form1());
}
else
{
Application.Exit();
}
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnKlik_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}