من أين أتحكم في سلوك الزر "X" في الجزء العلوي الأيمن من winform؟

StackOverflow https://stackoverflow.com/questions/2838979

سؤال

أنا أغامر بجعل تطبيق VB.NET أفضل قليلاً لاستخدامه من خلال جعل بعض النماذج غير معدلة.

أعتقد أنني اكتشفت كيفية استخدام dlg.show () و dlg.hide () بدلاً من استدعاء dlg.showdialog (). لدي مثيل في مربع الحوار الخاص بي في نموذج الطلب الرئيسي الخاص بي:

Public theModelessDialog As New dlgModeless

لإطلاق الحوار غير المعدل الذي أسميه

theModelessDialog.Show()

وضمن موافق وإلغاء معالجات الأزرار في dlgModeless أملك

Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.OK
    Me.Hide()
End Sub

Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
    Me.Hide()
End Sub

ويبدو أن هذا يعمل بشكل جيد.

زر "X" في الجزء العلوي اليمين هو الحصول على لي. عندما أغلق النموذج بهذا الزر ، حاول إعادة فتح النموذج ، أحصل عليه

ObjectDisposedException كان غير معلم. لا يمكن الوصول إلى كائن تم التخلص منه.

أشعر وكأنني أكثر من الطريق إلى هناك ، لكن لا يمكنني معرفة كيفية القيام بأي مما يلي:

  • إخفاء زر "X"
  • أمسك بالحدث حتى لا أتخلص من الكائن (فقط تعامله كما أصبت بالإلغاء)

أيه أفكار؟

فئة هذا الحوار System.Windows.Forms.Form.

هل كانت مفيدة؟

المحلول

يستخدم Me.Close() لإخفاء النموذج. لفتحه ، استخدم المقتطف التالي:

If theModelessDialog.IsDisposed Then
    theModelessDialog = New dlgModeless
End If
dlgModeless.Show()

إذا كان هذا يحفظ البيانات ، فستحتاج إلى تحديد طريقة لتخزينها (ربما في متغير ثابت/متغير في النموذج). هذه هي الطريقة الصحيحة للقيام بما تحاول تحقيقه.

يجب عليك أيضًا أن تسامحني إذا كان VB الخاص بي متوقفًا ، فقد مرت بعض الوقت.

نصائح أخرى

التقط الحدث الصيفي ، وإذا كان السبب هو تسيكيل المستخدم ، فقم بإلغاء الإلغاء على الحدث إلى TRUE.

شيء مثل ما يلي:

Private Sub Form1_FormClosing(sender as Object, e as FormClosingEventArgs) _ 
     Handles Form1.FormClosing

    if e.CloseReason = CloseReason.UserClosing then
        e.Cancel = true
        Me.Hide()
    end if

End Sub

يتيح لي الحدث الصيفي القيام بخروج مُدار للنموذج ، لذا قمت بتضمين سؤال للتأكيد على الخروج. لديّ أيضًا علامة نموذجية لإجبار الإلغاء على المكان الذي أريده ، وبالتالي لا أطرح السؤال. شكرا اقتراحك ساعدني كذلك :)

    Dim msgboxresponse As MsgBoxResult

    If e.CloseReason = CloseReason.UserClosing Then
        If Not Me.bTerminate Then
            msgboxresponse = MsgBox("Are you sure you want to cancel adding?", _
                                MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
            If msgboxresponse <> MsgBoxResult.Yes Then
                e.Cancel = True
                Return
            End If
        End If
    End If

@يوحنا كان يخفي النموذج في الكود الخاص به وتوفر الإجابات أعلاه حلًا لتلك الحالة. في كثير من الأحيان ، لا تخطط لاستخدام النموذج مرة أخرى ، لذلك أنت حقًا فعل تريد التخلص من النموذج. ستكون جميع الأنشطة ذات الصلة الوثيقة في مكان واحد إذا تعاملت مع الحدث النيئة باستخدام Me.FormClosing عن طريق إضافته إلى رمز anycancel/إغلاق/خروج لديك بالفعل. على سبيل المثال في قضية جون:

Private Sub Cancel_Button_Click(ByVal sender As System.Object, _ 
                                     ByVal e As System.EventArgs) _
                                 Handles Cancel_Button.Click, Me.FormClosing
....More code
Me.Dispose
End Sub

لاحظ استخدام Me.Dispose بدلا من أي موجود Me.Close. إذا تركت Me.Close ستقوم بإنشاء حلقة لا حصر لها. يرى هذا للاختلافات الدقيقة بين القرب والتخلص.

أتفق مع التعامل مع الحدث الصيغ. أو قم بتغيير الخصائص على النموذج لإخفاء التحكم في النظام x.

لقد جربت كل شيء ولم ينجح إذا كنت ترغب فقط في الإغلاق ، دون عرض مراسلة الرسائل ، ستحتاج فقط:

sub form1_formclosing (المرسل ككائن ، e كـ formClosingEventArgs) يتولى me.formclosing

 >e.Cancel = False
 >FORM2.Show()   (if you want to show another form)

نهاية الفرعية

آمل أن يساعدك هذا...!

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