Советы по простой форме Windows - PullRequest
0 голосов
/ 03 июня 2010

У меня есть ОЧЕНЬ простая форма окон, которую пользователь использует для управления "магазинами".

Каждый магазин имеет имя и номер и хранится в соответствующей таблице БД.

Форма имеет список магазинов, кнопку добавления, которая создает новый магазин, кнопку удаления и кнопку редактирования.

Кроме тех, у меня есть текстовые поля для имени и номера, а также кнопки сохранения / отмены.

Когда пользователь выбирает магазин из списка и нажимает кнопку «Редактировать», текстовые поля заполняются и активируются сохранение / отмена. Когда пользователь нажимает «добавить», я создаю новый магазин, добавляю его в список, активирую текстовые поля и кнопки сохранения / отмены, затем фиксирую его в базе данных, когда пользователь нажимает «сохранить», или удаляет его, когда пользователь щелкает. 'отмена'.

Прямо сейчас моя система событий выглядит следующим образом (в псевдо-коде. Так короче.)

add->click:
    store = new Store()
    listbox.add(store)
    populateAndEdit(store)

delete->click:
    store = listbox.selectedItem
    db.deleteOnSubmit(store)
    listbox.remove(store)
    db.submit()

edit->click:
    populateAndEdit(listbox.selectedItem)

save->click:
    parseAndSave(listbox.selectedItem)
    db.submit()
    disableTexts()

cancel->click:
    disableTexts()

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

Очевидным решением для меня было бы сделать его «модальным» процессом - то есть, когда я нажимаю кнопку «Изменить», я перехожу в режим редактирования, и кнопка «Сохранить» работает иначе, чем если бы я был в режиме добавления.

Я знаю, что мог бы сделать это более похожим на MVC, но я не думаю, что эта простая форма заслуживает дополнительной сложности. Я не очень опытен с winforms, поэтому я не уверен, что у меня есть правильная идея, как справиться с этим.

Есть ли лучший способ сделать это? Я хотел бы сделать это простым, но пригодным для использования.

Ответы [ 5 ]

6 голосов
/ 03 июня 2010

использовать некоторый тип идентификатора, то есть название магазина. Теперь, когда пользователь нажимает Сохранить, проверьте, не содержит ли ваша коллекция магазинов магазин с таким же именем. Если это так, это обновление, в противном случае это новый магазин.

Я понимаю, что использование названия магазина может оказаться для вас невозможным (например, супермаркет с большим количеством филиалов), но вы поняли.

3 голосов
/ 03 июня 2010

Конечно, у вас есть какой-то идентификатор в базе данных? Ваш объект будет предоставлять этот первичный ключ как свойство StoreID или ID, например. Если это GUID, это будет Guid.Empty для нового объекта, если это автоинкрементное целое число, то это будет ноль. Когда вы сохраняете его в базе данных, он должен получить действительный идентификатор, а затем вы можете легко определить, является ли объект новым или существующим.

0 голосов
/ 03 июня 2010

В вашей ситуации вы можете захотеть сохранить в списке больше, чем просто строку. Есть ли у вас какие-либо доменные объекты, которые представляют значения списка? Вместо этого добавьте их в список - не забудьте переопределить .ToString (), чтобы список заканчивал тем, что визуализировал что-то значимое. Когда пользователь выбирает Добавить, создайте новый объект домена и добавьте it в список, убедившись, что установлено соответствующее свойство, чтобы пометить его как новую запись для вставки в базу данных. И наоборот, любые записи, сохраненные в базе данных, а также все существующие записи, извлеченные из базы данных, могут быть соответствующим образом помечены, чтобы вы могли обрабатывать любые необходимые изменения и удаления.

0 голосов
/ 03 июня 2010

Вы можете просто поиграть с текстом кнопки сохранения, на случай, если это новое хранилище, измените его текст на «Вставить магазин», а в случае редактирования это будет «Обновить магазин».

add->click:
store = new Store()
listbox.add(store)
save.Text="Insert Store"
populateAndEdit(store)

delete->click:
store = listbox.selectedItem
db.deleteOnSubmit(store)
listbox.remove(store)
db.submit()


edit->click:
save.Text="Update Store"
populateAndEdit(listbox.selectedItem)


save->click:
parseAndSave(listbox.selectedItem)
if (save.Text.Equals("Insert Store"))
   db.InsertOnSubmit(listbox.selectedItem)    
db.submit()
disableTexts()


cancel->click:
disableTexts()

Надеюсь, это поможет!

0 голосов
/ 03 июня 2010

вы можете проверить какой-нибудь уникальный идентификатор, как упоминалось ранее, или в рамках, который использует моя компания (CSLA .NET), в наших объектах есть логическое поле IsNew, которое при создании нового объекта помечается как истинное. Когда данные считываются в объект из базы данных, поле IsNew помечается как ложное. Это дает вам возможность каким-то образом использовать новый конструктор по умолчанию во всех случаях, а затем, когда вы заполняете существующий элемент, пометьте его как false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...