0

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

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";

我的文本:

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

你有什么想法吗?

4

2 回答 2

3

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

Int32.解析

Number = Int32.Parse(comboBox1.ValueMember);

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

Int32.TryParse如果您想获得 bool 值作为回报而不是异常,则可以使用。

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

于 2013-11-06T14:55:04.940 回答
3

ValueMember仅用于确定组合框SelectedValue的值。要获得您的valueMember部分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);

注意:但是,该Reflection方法仅适用于DataSource您的组合框不是某个类DataTable时,因为 aDataTable将其公开Column nameValueMember不是它的任何属性,基础项目将是 a DataRowView,因此在这种情况下反射代码将失败。

于 2013-11-06T16:08:07.597 回答