2009-06-17 5 views
0

Проблема, с которой я в настоящее время сталкиваюсь, заключается в отображении нескольких полей графического интерфейса в свойства объекта (т. Е. Уровень представления для отображения бизнес-логики). Чтобы быть более конкретным, это в VB.Net 2.0 WinForms.GUI для сопоставления бизнес-объектов VB.Net

Характер решения требует, чтобы у нас было 4 столбца, которые демонстрируют один и тот же тип поведения в нашем графическом интерфейсе - каждый столбец, состоящий из 11 текстовых полей (мы просто используем этот небольшой размер выборки, поскольку проблема выходит за пределы 11 текстовых полей).

То, что я сейчас делаю это установка метки каждого текстового поля во всех четырех столбцах значения следующим образом:

Textbox1.tag = "name" 
Textbox2.tag = "type" 
Textbox3.tag = "speed" 

Когда событие поднятый в текстовое поле (например, нажатие клавиши), я смотрю на родительский контейнер, чей тег я также задал как строку, сопоставляющую конкретный объект. Я использую это в сочетании с тегом textbox, чтобы определить, какое свойство объекта нужно установить. В целом, это выглядит примерно так:

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 некоторых нечетных свойства, к которым можно сопоставить - таким образом, оператор select чрезвычайно длинный, многие из которых встроены в несколько методов, чтобы попытаться сделать DRY (я опустил код по существу концептуально реализация).

Вопрос: как я могу реорганизовать это? Я попытался использовать словари/хэши в определенной степени, но он либо стал слишком сложным, либо просто не реализовал смысл реализации, так как он еще больше запутал проблему.

Спасибо за помощь.

ответ

1

первая проблема, с которой вы справитесь, установив тег как объект. Поскольку тег не является строкой, а объектом типа.

И вторая проблема, которую вы решаете по отражению usin, но значение в теге должно точно соответствовать имени свойства.

_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text}) 

Отказ от ответственности отражение близко, но, возможно, не на 100% правильное.

+0

отражение будет хорошо работать на самом деле. Единственное, что каждое значение задано немного сложнее. Таким образом, мы могли бы иметь это как objectToMap.Customer.Name = sender.text, а затем objectToMap.Asset.Type = sender.text - поэтому в основном нужно получить/установить вложенные свойства, которые придают ему дополнительный уровень сложности – MunkiPhD

+0

Я ответил вопрос, но если вы измените правила, я должен изменить ответ. Проблема с вложенными свойствами также легко решена с отражением BTW. Но это был не вопрос. – chrissie1