من أين أتحكم في سلوك الزر "X" في الجزء العلوي الأيمن من winform؟
-
27-09-2019 - |
سؤال
أنا أغامر بجعل تطبيق 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)
نهاية الفرعية
آمل أن يساعدك هذا...!