سؤال

(VS2005, .Net 2.0)

لقد شكل ذلك يتم عرض مربع الحوار باستخدام ShowDialog() الأسلوب.النموذج CancelButton يتم تعيين الخاصية إلى زر على النموذج.حتى إذا أنا وضعت هذا الزر DialogResult صوتا النقر على الزر لا يزال يغلق مربع الحوار.أنا لا أريد أن يحدث هذا - كنت تريد أن تكون قادرة على التحكم في ما إذا كان مربع الحوار إغلاق أو لا.

لا تحدث هذه المشكلة مع النموذج AcceptButton - مع ذلك الزر DialogResult تعيين إلى لا شيء ، أستطيع أن أفعل ما المعالجة ضرورية ، ثم تقرر ما إذا كان أو عدم تعيين يدويا النموذج DialogResult أن يؤدي إلى إغلاق.

اعتقدت CancelButton الملكية كان من المفترض سولي الإشارة إلى الزر الذي يجب أن يكون "النقر" إذا كان الهروب هو الضغط (كما AcceptButton هو فقط من المفترض أن تشير إلى زر "انقر فوق" عندما أدخل الضغط).هل أنا مخطئ في هذا ؟ وقد فاتني بعض الأسباب الأخرى النموذج الإغلاق ؟ أو هذا الخلل ؟

تحرير:إضافة رمز.هذا هو مربع الحوار نموذج (شكل 2) مع إلغاء زر (زر 1).الزر إلغاء الأمر ما هو إلا شكل من أشكال CancelButton ، فإنه لا يكون DialogResult مجموعة لإلغاء لكن الضغط على زر لا يزال يغلق شكل

    private void InitializeComponent()
    {
        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // button1
        // 
        this.button1.Name = "button1";
        this.button1.Text = "button1";
        // 
        // Form2
        // 
        this.CancelButton = this.button1;
        this.Controls.Add( this.button1 );
        this.Name = "Form2";
        this.Text = "Form2";
        this.ResumeLayout( false );
    }
هل كانت مفيدة؟

المحلول

احذر أيضًا من أنه قد يتم إغلاق النموذج عن طريق الضغط على ALT+F4 والضغط على زر X ولن يؤدي كلا الاتجاهين إلى تشغيل حدث Cancel Click Click.

ما لم تكن تتعامل أيضًا مع هذه المواقف ، فلن يكون من الأفضل اتباع نصيحة Slurdge ومنع النموذج من الإغلاق في الحدث الصيغ.

تعديل:لاحظ أيضًا أنه إذا قمت بتغيير dialogresult للزر مرة أخرى إلى لا شيء في Windows Properties ، فأنت تقوم بتغييره إلى القيمة الافتراضية. إذا كانت القيمة هي القيمة الافتراضية للخاصية ، فلن يتم استمرارها في *.designer.cs. حتى لو تم استمراره ، يتم وضع رمز تهيئة النموذج أخيرًا في *.designer.cs وسيجعل لا شيء مع الإلغاء بسبب الخط:

this.CancelButton = this.button1;

كما يمكنك التحقق من العاكس ، يقوم الخط السابق بهذا:

public void set_CancelButton(IButtonControl value)
{
    base.Properties.SetObject(PropCancelButton, value);
    if ((value != null) && (value.DialogResult == DialogResult.None))
    {
        value.DialogResult = DialogResult.Cancel;
    }
}

يمكنك تغييره مرة أخرى إلى أي شيء في المُنشئ بعد استدعاء IlinizEcomponent ().

نصائح أخرى

يبدو أنك تريد إجراء التحقق من صحة الإغلاق.
الحدث الصيغ هو مناسب مثالي لهذا. هذا من شأنه أن يمكّنك من الحصول على نفس الرمز للتحكم في إغلاق أم لا.
فقط قم بتعيين خاصية Cancel إلى True لمنع الإغلاق. يرى الصيغة.

هذا هو السلوك الافتراضي.

من MSDN:

تتيح لك هذه الخاصية تعيين إجراء افتراضي لحدوثه عندما يضغط المستخدم على مفتاح ESC في التطبيق الخاص بك. يمكنك استخدام هذه الخاصية للسماح للمستخدم بالتنقل بسرعة في نموذج بسيط عن طريق السماح لهم ببساطة بالضغط على مفتاح ESC لإغلاق نافذة دون ارتكاب تغييرات بدلاً من النقر يدويًا على زر "إلغاء" مع الماوس.

CancelButton الخاصية

بدلا من محاولة التعامل مع هذا في button_click الحدث التعامل معها في form_closing الحدث.

MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
   if (DialogResult == DialogResult.Cancel)
   {
      // do my processing ...
      if (false)
         e.Cancel = true;   // stop the form from closing
   }
}

أتعامل مع بلدي تقبل زر رمز هنا أيضا أفترض أي شيء != DialogResult.طيب هو إلغاء, ولكن يمكنك أن تفعل كل ما هو مريح بالنسبة لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top