获取ComboBox的项目及其DataSource已填充

时间:2009-05-15 07:27:18

标签: c# winforms .net-2.0 controls combobox

考虑到有一个ComboBox,它通过其DataSource属性填充。 ComboBox中的每个项目都是自定义对象,ComboBox设置为DisplayMemberValueMember

IList<CustomItem> aItems = new List<CustomItem>();
//CustomItem has Id and Value and is filled through its constructor
aItems.Add(1, "foo"); 
aItems.Add(2, "bar");

myComboBox.DataSource = aItems;

现在的问题是,我想将这些项目读取为将在UI中呈现的字符串。考虑到我不知道ComboBox中每个项目的类型(我不知道CustomItem

这可能吗?

4 个答案:

答案 0 :(得分:3)

结合:

ComboBox1.DataSource = aItems;
ComboBox1.DisplayMember = "Value";

获取项目:

CustomItem ci = ComboBox1.SelectedValue as CustomItem;

编辑:如果你想得到的只是组合框的所有显示值的列表

List<String> displayedValues = new List<String>();
foreach (CustomItem ci in comboBox1.Items)
    displayedValues.Add(ci.Value);

答案 1 :(得分:2)

创建一个接口,比如ICustomFormatter,然后让这些自定义对象实现它。

interface ICustomFormatter
{
   public string ToString();
}

然后调用ToString()方法。

编辑:链接到Decorator模式。

答案 2 :(得分:2)

您应该能够通过反射获得ValueMember和DisplayMember。但是询问组合框可能会更容易一些。以下内容可行,但您可能想用SuspendUpdate或其他东西包围它。

string s = string.Empty;
int n = comboBox1.Items.Count;

for (int i = 0; i < n; i++)
{
    comboBox1.SelectedIndex = i;
    s = s + ';' + comboBox1.Text; // not SelectedText;
}

答案 3 :(得分:2)

虽然计算成本稍高,但Reflection可以做你想做的事情:

using System.Reflection;    
private string GetPropertyFromObject(string propertyName, object obj)
    {
        PropertyInfo pi = obj.GetType().GetProperty(propertyName);
        if(pi != null)
        {
            object value = pi.GetValue(obj, null);
            if(value != null)
            {
                return value.ToString();
            }
        }
        //return empty string, null, or throw error
        return string.Empty;
    }