GUI для сопоставления бизнес-объектов VB.Net - PullRequest
0 голосов
/ 17 июня 2009

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

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

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

1 Ответ

1 голос
/ 17 июня 2009

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

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

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

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

...