كيفية الوصول إلى التحكم في النماذج من داخل طريقة ToString من البنية المتداخلة

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

  •  29-09-2019
  •  | 
  •  

سؤال

أقوم ببناء تطبيق نموذج Windows صغير في C#. ضمن رمز النموذج ، حدد بنية عامة باستخدام طريقة tostring التي يجب أن تنشئ جزءًا من إخراجها من العناصر الموجودة في comboBoxes على نفس النموذج. هذا لا يبدو أنه يجب أن يكون صعبًا

public partial class Form1 : Form
{
 public struct OrderLineItem
    {
     string someString;
     int index;
     string ToString()
        {return someString + ActiveForm.sizeComboBox.Items[index].ToString();}  
    }
}

يشكو من أنه لا يمكن العثور على تعريف لـ SizeCombobox. إذا استخدمت بشكل صريح اسم النموذج ، فإنه يقول إن مرجع الكائن مطلوب للحقل الثابت ... لست متأكدًا تمامًا مما يعنيه ذلك. باستخدام this.sizeCombobox يشير إلى البنية ، وليس النموذج. باستخدام SizeCombobox فقط ، مرة أخرى ، يلزم مرجع الكائن.

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

المحلول

يعرف الهيكل عن فئته المحتوية يكتب, ، لكنه لا يعرف أي مثيل معين لهذا النوع ، إلا إذا أخبرته. على سبيل المثال ، يمكنك إنشاء مُنشئ يأخذ كائن Form1 ، ويمكنه حفظ إشارة إلى هذا النموذج في متغير عضو.

public partial class Form1 : Form 
{ 
 public struct OrderLineItem 
    { 
     string someString; 
     int index; 
     Form1 parentForm;

     internal OrderLineItem(Form1 parentForm)
     {
         this = new OrderLineItem();
         this.parentForm = parentForm;
     }

     string ToString() 
     {
         if (parentForm == null)
             return string.Empty;
         else
             return someString + parentForm.sizeComboBox.Items[index].ToString();
     }   
    } 
} 

ومع ذلك ، هذا تصميم مشكوك فيه بشكل خطير.

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

إذا تمكنت من عكس هذا الهيكل ، فإنه سيجعل الكود أكثر نظافة.

نصائح أخرى

لنفترض أن الشكل الآخر هو Form2 يمكنك الإلقاء ActiveForm إلى Form2:

var form2 = ActiveForm as Form2;
if (form2 != null) // form2 == null if ActiveForm is not of type Form2.
{
    form2.sizeComboBox...
}

يحرر:
ملاحظتان.

  1. بدلاً من الحصول على ActiveForm ، من الأفضل متجر Form2 في متغير عضو في Form1 عند إنشاء Form2.
  2. يجب عليك تغليف حصول قيم combobox خلف خاصية في Form2 ، مثل SelectedFooValue.
    public partial class Form1 : Form
{
    internal static Form1 ActiveForm { get; set; }

    public Form1()
    {
        InitializeComponent();
        ActiveForm = this;
    }

    public struct OrderLineItem
    {
        public override string ToString()
        {
            return ActiveForm.sizeComboBox.Items[index].ToString();
        }
    }

ومع ذلك لاحظ أن هذا ليس هو النهج الصحيح. ربما يمكنك نشر ما تحاول تحقيقه ويمكننا المساعدة؟

تحتاج إلى الإلقاء ActiveForm إلى Form1.

أعتقد أن شيئًا كهذا أعتقد (ليس لديك مقابل مفتوح الآن للتحقق):

return someString + ((Form1)ActiveForm).sizeComboBox.Items[index].ToString();

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

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