Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免在组合框c中出现重复的名称#_C#_Linq_Combobox - Fatal编程技术网

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();