هل من الممكن زيادة تحميل طريقة showdialog للنماذج وإعادة نتيجة مختلفة؟
-
04-10-2019 - |
سؤال
تحرير: هذه الطريقة تعمل في الواقع بشكل رائع وطلبت ذلك ثم وجدت الحل لاحقًا. لقد أضفت المكالمة الصحيحة في طريقة showdialog () المحملة الزائدة (إنها ليست حمولة زائدة ، أو حتى تجاوز ، لكنها تعمل بنفس الشيء. سؤالي الجديد هو السؤال الموجود في الأسفل.
لدي نموذج تنقر فيه أحد الأزرار الثلاثة. لقد حددت التعداد للنتائج التي تم إرجاعها. أريد إجراء المكالمة:
MyFormResults res = MyForm.ShowDialog();
يمكنني إضافة طريقة showdialog جديدة مع هذا الرمز:
public new MyFormResults ShowDialog()
{
//Show modal dialog
base.ShowDialog(); //This works and somehow I missed this
return myResult; //Form level variable (read on)
}
قمت بتعيين متغير مستوى النموذج للنتيجة عند النقر فوق الأزرار:
MyFormResults myResult;
private void btn1_click(object sender, EventArgs e)
{
myResult = MyFormsResults.Result1;
this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}
//Same as above for the other results
الشيء الوحيد الذي أفتقده هو الكود لإظهار مربع الحوار (وسيط) ثم إرجاع النتيجة. لا يوجد base.ShowDialog()
وظيفة ، فكيف أفعل هذا؟
تحرير: هناك "base.showdialog ()" وهو يعمل. هذا سؤالي الجديد هنا:
أيضا ، هل هذه هي أفضل طريقة للقيام بكل هذا ولماذا؟
شكرًا.
المحلول
تحرير: ليس من الجيد تغيير وظيفة ShowDialog()
, ، يتوقع الناس أن يعود DialogResult
وأظهر النموذج ، أقترح شيئًا مثل اقتراحي أدناه. وبالتالي ، لا يزال السماح ShowDialog()
لاستخدام الطريقة الطبيعية.
يمكنك إنشاء طريقة ثابتة على MyForm
, ، شيء مثل DoShowGetResult()
الذي سيبدو مثل هذا
public static MyResultsForm DoShowGetResult()
{
var f = new MyForm();
if(f.ShowDialog() == DialogResult.OK)
{
return f.Result; // public property on your form of the result selected
}
return null;
}
ثم يمكنك استخدام هذا
MyFormsResult result = MyForm.DoShowGetResult();
نصائح أخرى
جرب هذا ، يبدو أنه يعمل بالنسبة لي:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public DialogResult ShowDialog(string mes)
{
this.textBox1.Text = mes;
return base.ShowDialog();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
لا هذا ليس مستحيل. الحل المعتاد هو فضح نتائجك الحقيقية كقرة في النموذج:
public MyFormResults MyResult
{
get;
}
ثم يمكنك تعيين هذا:
private void btn1_click(object sender, EventArgs e)
{
MyResult = MyFormsResults.Result1;
this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}
وعادة ما يبدو رمز الاتصال هكذا:
if (form.ShowDialog == DialogResult.OK)
{
//do something with form.MyResult
}
ال ShowDialog
لا يمكن تجاوز الطريقة. ما يمكن أن تفعله على الرغم من أن إنشاء طريقة جديدة تُرجع كل من نتيجة showdialog وقيمة أخرى.
public ShowDialogResult ShowDialogWrappe(out MyFormResults result) {
var dialogRet = ShowDialog();
result = MyFormResults.Result1;
return dialogRet;
}