C# 如何避免在组合框c中出现重复的名称#
我遇到了一个问题,似乎无法使组合框中的名称显示一次而不是多个。我的代码中是否有导致此问题的内容?任何帮助都将不胜感激 下面是将名称链接到组合框的代码C# 如何避免在组合框c中出现重复的名称#,c#,linq,combobox,C#,Linq,Combobox,我遇到了一个问题,似乎无法使组合框中的名称显示一次而不是多个。我的代码中是否有导致此问题的内容?任何帮助都将不胜感激 下面是将名称链接到组合框的代码 private void Create_EmpDetails_Load(object sender, EventArgs e) { using (satsEntities Setupctx = new satsEntities()) { var viewEmpName = (from
private void Create_EmpDetails_Load(object sender, EventArgs e)
{
using (satsEntities Setupctx = new satsEntities())
{
var viewEmpName = (from viewEN in Setupctx.employees
join ufi u in Setupctx.ufis on viewEN.UFISID equals u.UFISID
select new { u.EmployeeName , u.UFISID}).Distinct().ToList();
cbName.DataSource = viewEmpName;
cbName.DisplayMember = "EmployeeName";
cbName.ValueMember = "EmployeeName";
//cbName.ValueMember = "UFISID";
}
}
这些行中的每一行都有一个不同的
UFISID
,因此Distinct()
不会删除它们
听起来你只是想向员工展示:
cbName.DataSource = Setupctx.Employees;
也许,你换一个就足够了
select new { u.EmployeeName , u.UFISID}
与
我将我的代码编辑为这个,我设法只显示一个名称,而不是多个记录
private void Create_EmpDetails_Load(object sender, EventArgs e)
{
using (satsEntities Setupctx = new satsEntities())
{
var viewEmpName = (from viewEN in Setupctx.employees
join ufi u in Setupctx.ufis on viewEN.UFISID equals u.UFISID
select new { u.EmployeeName }).Distinct().ToList();
cbName.DataSource = viewEmpName;
cbName.DisplayMember = "EmployeeName";
cbName.ValueMember = "EmployeeName";
//cbName.ValueMember = "UFISID";
}
}
在ComboBax中,我们将字符串显示为用户的DisplayMember,将成员id(可能对我们很重要)显示为我们的ValueMember。我们有更多的时间使用ids。我的例子是:
class Country
{
public string Name { get; set; }
public int ID { get; set; }
public Country( int i,string s) { Name = s; ID = i; }
}
class ComboItem
{
public string DisplayMember { get; set; }
public int ValueMember { get; set; }
}
class ComboItemEqualityComparer : IEqualityComparer<ComboItem>
{
public bool Equals(ComboItem item1, ComboItem item2)
{
if (item1.ValueMember == item2.ValueMember && item1.DisplayMember == item2.DisplayMember)
{
return true;
}
return false;
}
public int GetHashCode(ComboItem item)
{
string str = item.DisplayMember + item.ValueMember;
return str.GetHashCode();
}
}
享受
对于这个问题,我们可以:
....
select new ComboItem { ValueMember = u.UFISID, DisplayMember = u.EmployeeName }).Distinct(new yourIEqualityComparer()).ToList();
查看Print Screen键。或者。使用InlineComparer for distinct可能很有用。每个都有不同的ID,这是真的。那么有没有其他方法使其与众不同呢?@rookie view重载关于distinct。Distinct的比较器参数。这是我尝试您的方法时它提示的错误。“无法绑定到新的显示成员。参数名称:newDisplayMember”组合框中的数据应仅显示一个特定名称,而不是多次。如果
选择new{u.EmployeeName}
?@habibzare,“但不包含UFISID”-这是什么意思?我们想在组合框中显示员工姓名,但每个成员都有id。我们使用id。ID对我们很重要。这种连接完全没有用。您还可以直接绑定到员工
。问题是每个员工可能有多个UFISID。您需要的是员工的Id。因此,您在为项目正确执行此操作,但在您提供的示例中,使用了UFISID,它不是员工的Id。对于避免创建ComboItemEqualityCompare类,创建InlineComparer:http://stackoverflow.com/questions/5969505/using-iequalitycomparer-for-union // http://stackoverflow.com/questions/188120/can-i-specify-my-explicit-type-comparator-inline // http://stackoverflow.com/questions/1300088/distinct-with-lambda/
List<Country> countries = new List<Country> {
new Country(1,"UK"),
new Country(2,"Turkey"),
new Country(8,"Turkey"),
new Country(5,"Turkey"),
new Country(2,"Turkey"),
new Country(3,"USA") ,
new Country(3,"USA")}; //.Distinct(new CountryEqualityComparer()).ToList();
var Data = (from i in countries
select new ComboItem { ValueMember = i.ID, DisplayMember = i.Name }).Distinct(new ComboItemEqualityComparer()).ToList();
cbName.DataSource = Data;
cbName.DisplayMember = "DisplayMember";
cbName.ValueMember = "ValueMember";
public bool Equals(ComboItem item1, ComboItem item2)
{
if (item1.ValueMember == item2.ValueMember )
{
return true;
}
return false;
}
....
select new ComboItem { ValueMember = u.UFISID, DisplayMember = u.EmployeeName }).Distinct(new yourIEqualityComparer()).ToList();