【问题标题】:Advice on a simple Windows Form一个简单的 Windows 窗体的建议
【发布时间】:2023-04-08 19:45:01
【问题描述】:

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

每个商店都有名称和编号,并保存在相应的数据库表中。

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

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

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

现在,我的事件系统看起来像这样(在伪代码中。这样更短。)

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不是很有经验,所以我不确定我是否有正确的想法来解决这个问题。

有没有更好的方法来做到这一点?我想让它保持简单但可用。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

    我知道您可能无法使用商店的名称(即有很多分店的超市),但您明白了。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          在您的情况下,您可能希望考虑将不仅仅是一个简单的字符串存储到列表框中。你有列表框值代表的任何域对象吗?而是将这些添加到列表框 - 确保覆盖 .ToString() 以便列表框最终可视化一些有意义的东西。当用户选择添加时,创建一个新的域对象并将 it 添加到列表框,确保设置适当的属性以将其标记为插入数据库的新记录。相反,任何持久化到数据库的记录,以及从数据库中提取的所有现有记录,都可以适当地标记,以便您可以处理任何必要的编辑和删除。

          【讨论】:

          • 是的,已经这样做了。每个商店本身都存储在列表框中。
          【解决方案5】:

          您可以只玩保存按钮的文本,以防万一它是新商店,将其文本更改为“插入商店”,如果进行编辑,它将成为“更新商店”。

          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()
          

          希望这会有所帮助!

          【讨论】:

          • 使用 UI 控件的文本来确定程序的行为不是一个好主意。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 1970-01-01
          • 2013-04-11
          • 1970-01-01
          • 2012-01-18
          • 1970-01-01
          相关资源
          最近更新 更多