在C#中表示“组合框”

时间:2017-07-11 13:29:43

标签: c# combobox

我必须做一个有几个组合框的表格。 组合框具有表示为键 - 描述对的值。

每个Combobox的值都在一个单独的表Key<string> - Value<string>

如何在课堂上代表它?
假设我们将项目 类型 技术 )作为“枚举”,每个它们在数据库中的类型和技术表中(因此其数量取决于数据库中的行数)

class Project {
    public int Id {get; set;}
    public KeyValuePair<string, string> Type {get; set;}
    public KeyValuePair<string, string> Technology {get; set;}
}

或更好

class ProjectType { public string Key; public string Value; }
class ProjectTechnology { public string Key; public string Value; }

class Project {
    public int Id {get; set;}
    public ProjectType Type {get; set;}
    public ProjectTechnolgy Technology {get; set;}
}

从关注点分离的角度来看,我们应该使用第二种变体,但为什么如果我们能像第一种那样简单地复杂化呢?

2 个答案:

答案 0 :(得分:1)

  

假设我们将项目(类型和技术)作为“枚举”,每个都在数据库中的类型和技术表中

那么为什么不使用枚举?

public enum ProjectType
    {
        [Description("Friendly name for type 1")]
        Type1,
        [Description("Friendly name for type 2")]
        Type2,
        [Description("Friendly name for type 3")]
        Type3
    }

使用如下所示的扩展方法,您可以获得给定枚举值的描述​​:

public static string GetEnumDescription<TEnum>(this TEnum item)
        => item.GetType()
               .GetField(item.ToString())
               .GetCustomAttributes(typeof(DescriptionAttribute), false)
               .Cast<DescriptionAttribute>()
               .FirstOrDefault()?.Description ?? string.Empty;

(我得到了这段代码here,其中还展示了在您使用EF作为ORM的情况下如何将枚举映射到表格

Description属性可用作组合框内的显示字符串。如果,如你所说,这些值是固定的,如果它们不是或者它们可能会增长或改变,那么这种方式会起作用我会说第二种方法(创建单独的类)更好地遵循 SOLID 最佳实践,在这种情况下,我会说第二种方法违反了 O S 的实体,开放原则单一责任原则(更多关于SOLID)。

假设类型和技术可能会增长或改变,您可以遵循第一种方法。然后你违反了 S ,因为如果Type或Technology的定义发生变化,你的Project类可能会改变。 Supouse,你将来意识到你必须支持多种语言(eng,esp,ita等),然后你违反了 O ,因为TypeValuePair不能再代表Type和Technology的定义了并且你必须弄清楚如何实现这一点,最糟糕的是,你将不得不修改Project类,它应该不关心这个。

但是如果它们是固定值,则枚举方法更好,因为它强制使用始终已知的值,您不可能为项目分配不存在的类型或技术。

答案 1 :(得分:1)

这是一个意见和编码风格的问题,但这是我的看法:

第一个选项(简单的KeyValuePair)代码较少,但并不一定会使代码更简单。 第二个选项(创建表示ProjectType和ProjectTechnology的类)更好,因为它更容易阅读。

进一步的改进(我的观点再次)不是要命名这两个类的属性&#34; Key&#34;和&#34;价值&#34;。当然,这些属性代表的是比键和值更具体的东西吗?相应地命名,使其他人更容易理解他们所代表的内容。

希望这是你需要的答案。

P.S。它很清楚你打算写什么,但你忘了删除&#39; int&#39;在

public int KeyValuePair<string, string> Type {get; set;}
public int KeyValuePair<string, string> Technology {get; set;}

 public int ProjectType Type { get; set;}
 public int ProjectTechnolgy Technology { get; set;}