从ComboBox到int的ValueMember

时间:2013-11-06 14:50:18

标签: c# winforms combobox

我在组合框中有值成员,我需要将此值保存为整数... 这是我的代码:

public class Benzinky
{
   public int B_cislo { get; set; }
   public string Benzinka { get; set; }
}

var lines = File.ReadAllLines(@"C:...\pokus.txt");
var data = lines.Select(l => l.Split());
List<Benzinky> allB = data.Where(arr => arr.Length >= 2
                               && arr[1].Trim().All(Char.IsDigit))
                           .Select(arr =>
                              new Benzinky
                              {
                                 Benzinka = arr[0].Trim(),
                                 B_cislo = int.Parse(arr[1].Trim())
                              })
                           .ToList();
var bindingSourceB = new BindingSource();
bindingSourceB.DataSource = allB;
comboBox1.DataSource = bindingSourceB;
comboBox1.ValueMember = "B_cislo";
comboBox1.DisplayMember = "Benzinka";

my txt:

Prague 3106
Berlin 3107
........

你有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您应该将 comboBox1 valueMember 转换为整数,并将结果放入Number。这可以通过多种方式完成,您可以使用Convert.ToInt32(); 但我会看看Int32.Parse()Int32.TryParse()

Int32.Parse

Number = Int32.Parse(comboBox1.ValueMember);

上面的代码应该可以解决问题,但是当字符串不包含可以解析为整数的值时,您将遇到麻烦,将抛出异常。

如果您希望获得bool值而非异常,则可以使用Int32.TryParse

<强> Int32.TryParse

int Number;
bool result = Int32.TryParse(comboBox1.ValueMember, out Number);
if (result)
{
   Console.WriteLine("Converted '{0}' to {1}.", comboBox1.ValueMember, Number);         
}
else
{
  //conversion failed
  //Int32.Parse, would throw a formatexception here.
}

您可以尝试使用以下代码:

comboBox1.DataSource = bindingSourceB;
comboBox1.ValueMember = "B_cislo";
comboBox1.DisplayMember = "Benzinka";
int Number;
if(Int32.TryParse(comboBox1.ValueMember, out Number))
{
  //Conversion succeeded
}
else
{
  //Conversion failed, you should send a message to the user
  //Or fill Number with a default value, your choice.
}

来源:

MSDN Int32.Parse

MSDN Int32.TryParse

答案 1 :(得分:3)

ValueMember仅用于确定组合框 SelectedValue 的值。要获取valueMember的{​​{1}}部分,必须将基础项(在示例中为ComboBox item类型)转换为正确的类型,并从某个属性中获取所需的值,如果您事先知道基础数据类型和Benzinky,那么应该如何处理:

valueMember

但是,如果你想要一些动态的东西(当int x = ((Benzinky) comboBox1.Items[index]).B_cislo; //or using dynamic dynamic item = comboBox1.Items[index]; int x = item.B_cislo; 可能会在某个时间以编号方式改变时发生),你必须像这样使用valueMember

Reflection

注意:但是object item = comboBox1.Items[index]; var x = (int) item.GetType().GetProperty(comboBox1.ValueMember) .GetValue(item, null); 方法仅适用于您的comboBox的Reflection不是某个类DataSource的情况,因为DataTableDataTable公开为Column name而不公开它的任何属性,基础项将是ValueMember,因此在这种情况下反射代码将失败。