Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 如何删除wpf datagrid中的重复行?_C#_Wpf_Mvvm_Datagrid_Observablecollection - Fatal编程技术网

C# 如何删除wpf datagrid中的重复行?

C# 如何删除wpf datagrid中的重复行?,c#,wpf,mvvm,datagrid,observablecollection,C#,Wpf,Mvvm,Datagrid,Observablecollection,大家好,我正在使用Observable集合在wpf datagrid中存储值,但我想自动删除重复的行。有人能帮我吗。我曾试过这样做,但没有成功。我正在使用MVVM 我的代码: public ObservableCollection<VLANSPropertyClass> vlan { get; set; } vlan = new ObservableCollection<VLANSPropertyClass>(); void AddVlans() { if

大家好,我正在使用Observable集合在wpf datagrid中存储值,但我想自动删除重复的行。有人能帮我吗。我曾试过这样做,但没有成功。我正在使用MVVM

我的代码:

public ObservableCollection<VLANSPropertyClass> vlan { get; set; }


vlan = new ObservableCollection<VLANSPropertyClass>();

void AddVlans()
{
    if ((String.IsNullOrEmpty(VlanName)) ||
            String.IsNullOrEmpty(VlanID) ||
            String.IsNullOrEmpty(VlanIP1) ||
            String.IsNullOrEmpty(VlanIP2) ||
            String.IsNullOrEmpty(VlanIP3) ||
            String.IsNullOrEmpty(VlanIP4) ||
            String.IsNullOrEmpty(SelectedVlanPort))
    {
        MessageBox.Show("Please fill the empty fields", "Alert", MessageBoxButton.OK);
    }
    else
    {
        Console.WriteLine("Add vlan");
        var serial = new VLANSPropertyClass();
        serial.S_No = vlan.Count + 1;

        serial.vname = VlanName;

        serial.vid = VlanID;

        serial.ip = VlanIP1 + "." + VlanIP2 + "." + VlanIP3 + "." + VlanIP4;

        serial.mask = Vlanmask1 + "." + Vlanmask2 + "." + Vlanmask3 + "." + Vlanmask4;

        serial.vports = SelectedVlanPort;




        if (itemexists())
        {
            MessageBox.Show("Value already present");
        }
        else
        {

            vlan.Add(serial);
        }
    }
}





bool itemexists()
{

    var item = new VLANSPropertyClass();
    return
            (item.vname == VlanName) &&
            (item.ip == VlanIP1 + "." + VlanIP2 + "." + VlanIP3 + "." + VlanIP4) &&
            (item.vname == VlanName) &&
            (item.vports == SelectedVlanPort);
}
publicobservableCollection vlan{get;set;}
vlan=新的ObservableCollection();
void AddVlans()
{
if((String.IsNullOrEmpty(VlanName))||
String.IsNullOrEmpty(VlanID)||
String.IsNullOrEmpty(VlanIP1)||
String.IsNullOrEmpty(VlanIP2)||
String.IsNullOrEmpty(VlanIP3)||
String.IsNullOrEmpty(VlanIP4)||
String.IsNullOrEmpty(SelectedVlanPort))
{
MessageBox.Show(“请填写空白字段”,“提醒”,MessageBox按钮。确定);
}
其他的
{
Console.WriteLine(“添加vlan”);
var serial=新的VLANSPropertyClass();
serial.S_No=vlan.Count+1;
serial.vname=vlaname;
serial.vid=VlanID;
serial.ip=VlanIP1+“+VlanIP2+”+VlanIP3+“+VlanIP4;
serial.mask=VLANASK1+“+VLANASK2+”+VLANASK3+“+VLANASK4;
serial.vports=所选VLAN端口;
如果(itemexists())
{
MessageBox.Show(“值已存在”);
}
其他的
{
添加(串行);
}
}
}
bool itemexists()
{
var item=新的VLANSPropertyClass();
返回
(item.vname==VLAName)&&
(item.ip==VlanIP1+“+VlanIP2+”+VlanIP3+“+VlanIP4)&&
(item.vname==VLAName)&&
(item.vports==SelectedVlanPort);
}

上述方法是添加行,但不会自动删除重复行。任何帮助都非常有用。

您可以使用
LinQ
从集合中删除重复项。试着这样做:

vlan = GetSomeData(); // Fill with data however you want
vlan = new ObservableCollection<VLANSPropertyClass>(vlan.Distinct());
vlan=GetSomeData();//用你想要的方式填充数据
vlan=新的ObservableCollection(vlan.Distinct());
这甚至可以缩短为:

vlan = new ObservableCollection<VLANSPropertyClass>(GetSomeData().Distinct());
vlan=newobservetecollection(GetSomeData().Distinct());

这只适用于删除完全重复的对象,但。。。也就是说,共享相同引用的对象。如果您只想删除具有相同属性值的对象,那么可以使用带有参数的重载。当然,您需要实现
IEqualityComparer
接口才能使其正常工作。

对不起,我的评论……我没有正确地看到您的代码

你的问题出在你的书呆子身上

试试这个:

if (vlan.FirstOrDefault( YOUR_CONDITIONS) ==null)
return false;
else return true;
我想你的情况应该是这样的:

x=>x.vname==serial.name&&

boolexistsitem应接收串行as参数

问候,

==========新编辑

    bool itemexists(VLANSPropertyClass serial){        
    if(vlan.FirstOrDefault(x=>x.vname ==serial.vname && serial.ip==x.ip && x.vports==serial.vports) == null)
    return false;
    else return true;    
}         

为什么不在添加新行之前先验证该行是否已存在?@sexta13…您能详细说明一下吗??