从字典更改名称到友好名称的Winform绑定下拉列表

时间:2013-11-15 18:00:38

标签: c# winforms dictionary combobox

使用.net 4.0我有一个win形式的组合框,我从字典绑定,这工作正常。但是,我想更改用户在下拉列表中看到的名称。

例如..我希望下拉菜单说10%,20%,30%...... 100%。

这是我的班级,其中包含百分比和各自的身高值。

    enum SizeType : int
    {
        Height_10_Pct = 40,
        Height_20_Pct = 80,
        Height_30_Pct = 120,
        Height_40_Pct = 160,
        Height_50_Pct = 200,
        Height_60_Pct = 240,
        Height_70_Pct = 280,
        Height_80_Pct = 320,
        Height_90_Pct = 360,
        Height_100_Pct = 400)
    }

创建字典项

    public static Dictionary<string, int> ThumbSizeOptions = new Dictionary<string, int>(BuildThumbSizeOptions());

    public static Dictionary<string, int> BuildThumbSizeOptions()
    {
        ThumbSizeOptions = new Dictionary<string, int>();    
        foreach (SizeType val in Enum.GetValues(typeof(SizeType)))
        {
            ThumbSizeOptions.Add(val.ToString(), (int)((val)));
        }
        return ThumbSizeOptions;
    }

要在Win Form中的组合框中绑定的代码:

     ddlThumbSize.DataSource = new BindingSource(ThumbSizePref.ThumbSizeOptions, null);
     ddlThumbSize.DisplayMember = "Key";
     ddlThumbSize.ValueMember = "Value";

提前谢谢。

3 个答案:

答案 0 :(得分:2)

尝试ListControl.Format事件:( ComboBoxListControl

ddlThumbSize.Format += (s, e) => {
   e.Value += " %";
};

答案 1 :(得分:1)

  1. 在您的特定情况下,您只需使用String.Format("{0}%", ((int)val) >> 2)作为Dictionary中的关键字:

    ThumbSizeOptions.Add(String.Format("{0}%", ((int)val) >> 2), (int)val);
    
  2. 更通用的方法是使用自定义属性。代码:

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method)]
    public sealed class EnumDisplayNameAttribute : Attribute
    {
        public readonly string Displayname;
    
        public EnumDisplayNameAttribute(string displayname)
        {
            Displayname = displayname;
        }
    
        public static EnumDisplayNameAttribute Get<T>(T item)
        {
            FieldInfo member = typeof(T).GetField(item.ToString());
            if (member == null)
                return null;
    
            object[] attrs = member.GetCustomAttributes(typeof(EnumDisplayNameAttribute), true);
            return attrs.Length == 0 ? null : attrs[0] as EnumDisplayNameAttribute;
        }
    }
    
    enum SizeType : int
    {
        [EnumDisplayName("10%")]
        Height_10_Pct = 40,
        [EnumDisplayName("20%")]
        Height_20_Pct = 80,
        [EnumDisplayName("30%")]
        Height_30_Pct = 120,
        [EnumDisplayName("40%")]
        Height_40_Pct = 160,
        [EnumDisplayName("50%")]
        Height_50_Pct = 200,
        [EnumDisplayName("60%")]
        Height_60_Pct = 240,
        [EnumDisplayName("70%")]
        Height_70_Pct = 280,
        [EnumDisplayName("80%")]
        Height_80_Pct = 320,
        [EnumDisplayName("90%")]
        Height_90_Pct = 360,
        [EnumDisplayName("100%")]
        Height_100_Pct = 400
    }
    
    public static Dictionary<string, int> ThumbSizeOptions = new Dictionary<string, int>(BuildThumbSizeOptions());
    
    public static Dictionary<string, int> BuildThumbSizeOptions()
    {
        ThumbSizeOptions = new Dictionary<string, int>();
        foreach (SizeType val in Enum.GetValues(typeof(SizeType)))
        {
            ThumbSizeOptions.Add(EnumDisplayNameAttribute.Get(val).Displayname, (int)val);
        }
        return ThumbSizeOptions;
    }
    

答案 2 :(得分:1)

在您的BuildThumbSizeOptions()中,您可以像这样计算您的comboxbox值:

public static Dictionary<string, int> BuildThumbSizeOptions()
{
    ThumbSizeOptions = new Dictionary<string, int>();

    var max = (double)SizeType.Height_100_Pct;
    foreach (int val in Enum.GetValues(typeof(SizeType)))
    {
        double perc = 100.0 / max * (double)val;
        ThumbSizeOptions.Add(perc + "%", val);
    }
    return ThumbSizeOptions;
}

你现在的方式没有动态。

扩展此功能可以丢弃静态枚举SizeType并仅使用一个保持最大(100%)高度的变量。

public static double MAXIMUM_HEIGHT = 400.0;
public static Dictionary<string, int> BuildThumbSizeOptions()
{
    ThumbSizeOptions = new Dictionary<string, int>();

    for (int perc = 10; perc <= 100; perc += 10)
    {
        var size = MAXIMUM_HEIGHT / 100.0 * perc;
        ThumbSizeOptions.Add(perc + "%", (int)size);
    }
    return ThumbSizeOptions;
}

希望它有所帮助,尽管还有其他答案; - )