【问题标题】:C# Combobox - "deleted entities"?C# 组合框 - “已删除的实体”?
【发布时间】:2019-04-29 18:06:45
【问题描述】:

对于任何提供 select 字段并由特定数据源填充的应用程序都是一场斗争:首先一切正常,但是一旦应用程序老化,一些较旧的条目可能会被删除,从而导致以下问题之前的 select 字段无法再访问相关实体。

打开一个视图,其中一个选择指向已删除的数据行将(最好的情况)显示empty string

我们以某种方式设计了我们的系统,即删除不是真正的删除操作,而只是设置已删除标志。 (所以,所有的信息都还在)

但是,当将数据绑定与 C# 一起使用时(或者即使不使用),最明显的用例仍然没有被一般机制覆盖(我假设):

  • Select-Field 应该显示所有 NOT-Deleted-Entities,同时创建一个包含对相关实体的引用的新对象。
  • Select-Field(填充方式完全相同)应该显示“已删除”实体,如果它是在“天/月/年”之前选择的。

有没有“方便”的解决方案?

目前我们正在为每个数据源使用“代理方法”,如果它不在“可用数据”集合中,它将重新加载已删除实体的数据 - 但很难相信没有更好的处理方法有了这个,因为这个问题几乎适用于所有的语言?

【问题讨论】:

    标签: c# database select combobox dropdown


    【解决方案1】:

    在规范化数据库中,您将有一个带有ON DELETE NO ACTION/RESTRICT 事件的约束,这将阻止从列表中删除引用的元素。这将迫使您决定要对引用行执行什么操作。

    通过您手动控制的删除,这可能已被触发器覆盖。由于这些都没有实现,您只剩下一件事要做:在渲染 UI 之前使用所选选项更新下拉列表。我的做法(在Java,我不擅长C#):

    List<String> options = getNonDeletedWhatever();
    if (!options.contains(currentEntity.getWhatever())) {
        options.add(currentEntity.getWhatever());  // This optionally inserts an outdated value
    }
    

    或者简单地说:

    Set<String> options = getNonDeletedWhatever();
    options.add(currentEntity.getWhatever());      // This optionally inserts an outdated value
    

    【讨论】:

    • 谢谢。是的,这就是我目前实现它的方式。只是希望有一些不错的方法,我不知道。即因为通常您使用“未删除”值填充选择字段,如果您在控件上调用combobox1.SelectedItem = entity.getWhatever() 之前指定Combox1.SelectedItemMustExist=false,则可能(通过代码)选择一个不存在的条目或任何花哨的捷径。 (即源集合的隐式处理)
    • 不能对数据库进行真正的删除。如果是某个客户因任何原因被删除,所有旧的“订单”仍应引用该客户。只是不应该再为新订单选择它了。
    【解决方案2】:

    我通过创建可用(未删除)项目列表来解决它,如果所选项目是已删除项目,则我将该项目添加到列表中。

    此列表成为我的下拉列表的数据源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多