考虑到有一个ComboBox,它通过其DataSource属性填充。 ComboBox中的每个项目都是自定义对象,ComboBox设置为DisplayMember
和ValueMember
。
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
)
这可能吗?
答案 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;
}