واجهة المستخدم الرسومية لرسم الخرائط كائن الأعمال VB.Net
-
06-07-2019 - |
سؤال
وقضية أواجه حاليا هو رسم خرائط حقول GUI متعددة للاعتراض خصائص (أي عرض طبقة إلى طبقة رسم الخرائط الأعمال المنطق). أن تكون أكثر تحديدا، وهذا هو في VB.Net 2.0 WinForms عناصر.
وطبيعة الحل يتطلب أن يكون لدينا 4 أعمدة الذي يحمل نفس النوع من السلوك على واجهة المستخدم الرسومية لدينا - كل عمود مكون من 11 مربعات النص (وسوف مجرد استخدام هذا صغر حجم العينة، وتمتد المشكلة إلى ما بعد 11 مربعات النص) .
ما أقوم به حاليا هو وضع علامة على كل النص في كافة الأعمدة الأربعة إلى قيمة مثل ذلك:
Textbox1.tag = "name"
Textbox2.tag = "type"
Textbox3.tag = "speed"
وعندما يتم رفع هذا الحدث من قبل النص (على سبيل المثال بضغطة)، وأنا أنظر في الحاوية الأصل، الذي أكون قد وضعت أيضا كسلسلة رسم كائن محدد العلامة. أنا استخدم هذا، جنبا إلى جنب مع العلامة مربع النص، وتحديد ما الكائن الملكية ولست بحاجة لتعيين. عموما، يبدو شيئا من هذا القبيل:
dim objectToMapTo //the generic parent object which all my custom myObjects inherit from
select case sender.parent.tag //the parent object that the property needs to map to
case "column1"
objectToMapTo = myObject1
case "column2"
objectToMapTo = myObject2
case "column3"
objectToMapTo = myObject3
case "column4"
objectToMapTo = myObject4
end select
select case sender.tag //the actual textbox's tag value which maps to the property
case "name"
objectToMapTo.Name = sender.text //sender.text is conceptual for
//the data that needs to be set -- i.e. this could be a calculated
//number based on the text, or simply a string, etc
case "type"
objectToMapTo.Type = sender.text
case "speed"
objectToMapTo.Speed = sender.text
...
end select
وكما ترون هذا يمكن الحصول على سيئة للغاية، وليس بسرعة. حاليا نحن ضبط 43 بعض الخصائص الفردية التي يمكن تعيينها إلى - وبالتالي أن العبارة حدد طويل للغاية - وكثير منها هي جزء لا يتجزأ في أساليب متعددة في محاولة ومحاولة DRY (لقد خففت رمز إلى الأساس المفاهيمي التنفيذ).
والسؤال هو: كيف يمكنني ريفاكتور هذا؟ لقد حاولت استخدام القواميس / تجزئات إلى حد ما، لكنها إما أصبحت معقدة أكثر من اللازم، أو مجرد لم يجعل شعور تنفيذ كما الملتوية المشكلة حتى أكثر من ذلك.
وشكرا للمساعدة.
المحلول
والمشكلة الأولى التي سول عن طريق وضع علامة ككائن. منذ العلامة غير سلسلة ولكن من وجوه النوع.
والمشكلة الثانية أن تحل من قبل النقيب انعكاس لكن من القيمة في العلامة يجب أن تطابق PROPERTYNAME بالضبط.
_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text})
وتنصل انعكاس قريب ولكن ربما ليس صحيحة 100٪.