我有一个非常简单的窗体,供用户用来管理“商店”。
每个商店都有一个名称和编号,并保存在相应的数据库表中。
表单包含商店列表框,创建新商店的添加按钮,删除按钮和编辑按钮。
除了那些我有文字框的名称和号码,以及保存/取消按钮。
当用户从列表框中选择商店并单击“编辑”时,文本框将变为填充状态,保存/取消将变为活动状态。当用户点击“添加”时,我创建一个新的商店,将其添加到列表框,激活文本框和保存/取消按钮,然后在用户点击“保存”时将其提交到数据库,或者在用户点击时将其丢弃'取消'。
现在,我的事件系统看起来像这样(在伪代码中。它只是那么短。)
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不太熟悉,所以我不确定我是否对如何解决这个问题有正确的想法。
有更好的方法吗?我想保持简单,但可以使用。
答案 0 :(得分:6)
使用某种类型的标识符,即商店的名称。现在,当用户按下“保存”时,请检查您的商店集合是否已包含具有相同名称的商店。如果是,则是更新,否则它是新商店。
我意识到你可能无法使用商店的名称(即有许多分店的超市),但你明白了。
答案 1 :(得分:3)
你肯定在数据库中有某种ID吗?例如,您的对象会将此主键公开为StoreID或ID属性。如果它是一个GUID,它将是一个新对象的Guid.Empty,如果它是一个自动递增的整数,它将为零。当您将其保存到数据库时,它应该获得一个有效的ID,然后您可以轻松地判断该对象是新的还是现有的。
答案 2 :(得分:0)
你可以检查前面提到的某种唯一标识符,或者在我公司使用的框架中(CSLA .NET)我们的对象上有一个布尔IsNew字段,当我们创建一个新对象时,该字段标记为true。当数据从数据库读入对象时,IsNew字段被标记为false。这使您能够在所有情况下使用默认的新构造函数,然后在填充现有项时将其标记为false。
答案 3 :(得分:0)
在您的情况下,您可能希望查看不仅仅是将简单字符串存储到列表框中。您是否有列表框值表示的域对象?将这些添加到列表框中 - 确保覆盖.ToString(),以便列表框最终可视化有意义的内容。当用户选择“添加”时,创建一个新的域对象并将它添加到列表框中,确保将相应的属性设置为将其标记为插入数据库的新记录。相反,任何持久保存到数据库的记录以及从数据库中提取的所有现有记录都可以进行适当标记,以便您可以处理任何必要的编辑和删除。
答案 4 :(得分:-1)
您可以使用保存按钮的文本,以防万一它的新商店将其文本更改为“插入商店”,如果是编辑它将是“更新商店”。
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()
希望这有帮助!