هل من الممكن زيادة تحميل طريقة showdialog للنماذج وإعادة نتيجة مختلفة؟

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

سؤال

تحرير: هذه الطريقة تعمل في الواقع بشكل رائع وطلبت ذلك ثم وجدت الحل لاحقًا. لقد أضفت المكالمة الصحيحة في طريقة 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top