繁体   English   中英

从ComboBox到int的ValueMember

[英]ValueMember from ComboBox to int

我在组合框中有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";

我的txt:

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

你有什么想法吗?

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

Int32.Parse

Number = Int32.Parse(comboBox1.ValueMember);

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

如果您想获取布尔值而不是异常,则可以使用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

ValueMember仅用于确定组合框SelectedValue的值。 要获取ComboBox itemvalueMember部分,必须将基础项(在示例中为Benzinky类型)转换为正确的类型,并从某些属性中获得所需的值,如果您知道,则应按以下步骤进行操作底层数据类型和valueMember事先为:

int x = ((Benzinky) comboBox1.Items[index]).B_cislo;
//or using dynamic
dynamic item = comboBox1.Items[index];
int x = item.B_cislo;

但是,如果您想要动态的东西(当valueMember可能在某个时间以valueMember方式更改时会发生),则必须像这样使用Reflection

object item = comboBox1.Items[index];
var x = (int) item.GetType().GetProperty(comboBox1.ValueMember)
                            .GetValue(item, null);

注意 :但是,仅当comboBox的DataSource不是DataTable类的类时, Reflection方法才适用。因为DataTable将其Column name公开为ValueMember而不是其任何属性,因此基础项将是DataRowView ,因此在这种情况下反射代码将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM