C# 关于简单Windows窗体的建议

C# 关于简单Windows窗体的建议,c#,winforms,C#,Winforms,我有一个非常简单的windows窗体,用户使用它来管理“商店” 每个存储都有一个名称和编号,并保存在相应的DB表中 表单有一个存储列表框、一个创建新存储的添加按钮、一个删除按钮和一个编辑按钮 除此之外,我还有姓名和号码的文本框,以及保存/取消按钮 当用户从列表框中选择商店并单击“编辑”时,文本框将填充,保存/取消将激活。当用户单击“添加”时,我创建一个新的存储,将其添加到列表框中,激活文本框和保存/取消按钮,然后在用户单击“保存”时将其提交到数据库中,或者在用户单击“取消”时将其丢弃 现在,我的

我有一个非常简单的windows窗体,用户使用它来管理“商店”

每个存储都有一个名称和编号,并保存在相应的DB表中

表单有一个存储列表框、一个创建新存储的添加按钮、一个删除按钮和一个编辑按钮

除此之外,我还有姓名和号码的文本框,以及保存/取消按钮

当用户从列表框中选择商店并单击“编辑”时,文本框将填充,保存/取消将激活。当用户单击“添加”时,我创建一个新的存储,将其添加到列表框中,激活文本框和保存/取消按钮,然后在用户单击“保存”时将其提交到数据库中,或者在用户单击“取消”时将其丢弃

现在,我的事件系统看起来是这样的(在psuedo代码中,它只是短了一点)

问题在于我如何确定我们是插入一个新商店,还是更新一个现有的商店

对我来说,一个显而易见的解决方案是将其变成一个“模式”过程——也就是说,当我单击“编辑”时,我进入编辑模式,而“保存”按钮所做的事情与我处于“添加”模式时的不同

我知道我可以让它更像MVC,但我真的不认为这种简单的形式值得增加复杂性。我对winforms不是很有经验,所以我不确定我是否有解决这个问题的正确想法


有更好的方法吗?我希望保持它的简单性,但可用。

使用某种类型的标识符,即商店的名称。现在,当用户按Save时,检查您的存储集合是否已包含同名的存储。如果是,则为更新,否则为新店


我意识到你可能不可能使用商店的名称(例如,一个有很多分店的超市),但你明白了。

你肯定在数据库中有某种ID吗?例如,您的对象会将此主键公开为StoreID或ID属性。如果是GUID,则新对象的GUID.Empty为空,如果是自动递增整数,则为零。当您将其保存到数据库中时,它应该获得一个有效的ID,然后您可以轻松地判断对象是新的还是现有的。

您可以检查前面提到的某种唯一标识符,或者在我公司使用的框架(CSLA.NET)中,我们的对象上有一个布尔值IsNew字段,当我们创建一个新对象时,字段被标记为true。当数据从数据库读入对象时,IsNew字段被标记为false。这使您能够在所有情况下使用默认的新构造函数,然后在填充现有项时将其标记为false。

您只需播放保存按钮的文本,以防新存储将其文本更改为“插入存储”,而在编辑时则为“更新存储”


希望这有帮助

在您的情况下,您可能希望在列表框中存储的不仅仅是一个简单的字符串。您是否有列表框值表示的域对象?将这些内容添加到列表框中-确保重写.ToString(),以便列表框最终可视化有意义的内容。当用户选择“添加”时,创建一个新的域对象并将其添加到列表框中,确保设置了相应的属性以将其标记为要插入数据库的新记录。相反,保留到数据库的任何记录以及从数据库中提取的所有现有记录都可以进行适当标记,以便您可以处理任何必要的编辑和删除。

是,已经这样做了。每个存储本身都存储在列表框中。使用UI控件的文本来确定程序的行为不是一个好主意。
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()
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()