数据绑定自定义对象和使用唯一值填充控件等

时间:2012-03-07 13:18:19

标签: c# winforms data-binding

我有一个自定义对象,它从数据库中的表中获取值。让我们称之为产品表。 我的代码填充List<Product>并使用myCombobox.DisplayMember = "Country"绑定到多个组合框以显示正确的值。

这是示例代码(没有任何异常,OnFormLoad())。

DatabaseTools dbTools = new DatabaseTools();
List<Product> productList = dbTools.GetProducts();

cboCountry.BeginUpdate();
cboCountry.DataSource = productList ;
cboCountry.DisplayMember = "Country";
cboCountry.EndUpdate();

足够简单。但是,从数据库返回的某些值要么丢失,要么重复,要么在控件中显示之前需要进行字符串格式化。有没有办法做到这一点。否则我的组合框中的数据看起来很糟糕:

enter image description here

2 个答案:

答案 0 :(得分:2)

为防止重复产品使用EqualityComparer:

 public class ProductCountryEqualityComparer : IEqualityComparer<Product>
    {

        #region IEqualityComparer<Product> Members

        public bool Equals(Product x, Product y)
        {
            return x != null && y != null && x.Country  == y.Country;
        }

        public int GetHashCode(Product obj)
        {
            return 0;
        }

        #endregion
    }

然后:

//That will make products distincts according to there Country
productList = productList.Distinct(new ProductCountryEqualityComparer()).ToList();

格式化国家/地区:

productList = productList.Distinct(new ProductCountryEqualityComparer())
              .Select(f => new Product() 
              {
               Country = string.Format(f.Country,"SomeFormat") 
              }).ToList();

订购:

productList = productList.Distinct(new ProductCountryEqualityComparer())
              .Select(f => new Product() 
              {
               Country = string.Format(f.Country,"SomeFormat") 
              }).OrderBy(f => f.Country).ToList();

只需使用最后一个:)

答案 1 :(得分:1)

为什么不LINQ,保存必须访问数据库,因为您没有使用国家/地区对象的唯一ID,这应该有效...

            List<string> countries = new List<string>() 
            { "Brazil", "Pakistan", "Pakistan", "Norway", "Senegal", "Senegal", "Senegal", };
            // Place into a LINQ query and utilise the distinct keyword
            var unique = (from c in countries
                          select c).Distinct().ToArray();
            // Test output
            Array.ForEach<string>(unique, x => Console.WriteLine(x));
            Console.ReadKey();