c# - 如何处理(国家)代码列表中的弃用值

标签 c# .net vb.net database-design

假设我们有一个包含所有国家/地区代码的代码列表。国家代码是 Countries 表的主键,它在数据库中的许多地方用作外键。在我的应用程序中,国家通常显示为多个表单的下拉列表。

一些过去曾经存在的国家不再存在,例如Serbia and Montenegro , 其中有 SCG 的国家代码。

我有两个目标:

  • 不允许用户使用这些旧值(因此在插入数据时这些值不应在下拉列表中可见)
  • 用户应该仍然能够(只读)打开旧内容,在这种情况下,已弃用的值应该在下拉列表中可见。

我看到两个选项:

  • 重命名已弃用的值,例如从“CountryName”到“!!!!!CountryName”。这种方法最容易实现,但也有明显的缺点。
  • 将 IsActive 列添加到 Countries 表,并将所有已弃用的值设置为 false,将所有其他值设置为 true。在用户可以插入数据的所有表单上,只显示事件的值。在只读表单上,我们可以显示所有值(包括已弃用的值),以便用户能够显示旧数据。但是在我的某些表单上,用户还应该能够编辑数据,这意味着不推荐使用的值应该对他隐藏。这意味着,每个保管箱都应该有这样的初始化逻辑:如果显示的数据是只读的,则在保管箱中包含不推荐使用的值,如果数据也用于编辑,则将其排除。但这需要大量工作并且容易出错。

还有其他想法?

最佳答案

我经常处理这种情况,并使用“事件”标志来解决问题,正如您所描述的那样。当我用值填充下拉列表时,我只加载“事件”数据并包含最多 1 个弃用值,但前提是它正在使用。 (即,如果我正在查看一个人的记录,并且该人有一个已弃用的国家/地区,那么该国家/地区将与活跃国家/地区一起包含在下拉列表中。我在只读和编辑模式下执行此操作,因为在我的案例,如果一个人的记录(例如)列出了一个已弃用的国家/地区,他们可以继续使用它,但是一旦他们将其更改为未弃用的国家/地区,然后保存它,他们将永远无法切换回来(您的用例可能会有所不同)。

所以关键的区别是,即使在只读模式下,我也不会将所有已弃用的国家/地区添加到 DDL,只是将已弃用的国家/地区添加到我正在查看的记录中,即便如此,也只有当该记录已被使用。

这是我在加载下拉列表时使用的逻辑示例:

    protected void LoadSourceDropdownList(bool AddingNewRecord, int ExistingCode)
    {
        using (Entities db = new Entities())
        {
            if (AddingNewRecord) // when we are adding a new record, only show 'active' items in the drop-downlist.
                ddlSource.DataSource = (from q in db.zLeadSources where (q.Active == true) select q);

            else // for existing records, show all active items AND the current value.
                ddlSource.DataSource = (from q in db.zLeadSources where ((q.Active == true) || (q.Code == ExistingCode)) select q);

            ddlSource.DataValueField = "Code";
            ddlSource.DataTextField = "Description";
            ddlSource.DataBind();

            ddlSource.Items.Insert(0, "--Select--");
            ddlSource.Items[0].Value = "0";
        }
    }

关于c# - 如何处理(国家)代码列表中的弃用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056255/

相关文章:

vb.net - 如何在 VB.NET 中向 System.Windows.Form.Control 添加属性?

c# - 获取 GIF 以在 WPF 中播放(使用 GifImage 类)

c# - 为什么 fluent assertion 失败但 Assert 通过枚举?

javascript - 是否可以使用 C# 从使用 Javascript 动态添加的行中获取值?

.net - 面向对象的正确模式

c# - ASP.net 在上传/解密给用户后加密文件

c# - Nancy 应用程序的动态站点地图生成器

c# - Nsubstitute:收到检查错误的方法

.net - 使用 PowerShell 将一个 FTP 目录中的所有文件移动到同一服务器上的另一个目录

.net - FileInfo.IsReadOnly 与 FileAttributes.ReadOnly