2014-09-01 82 views
0

嗨,大家好我正在使用Observable集合来存储wpf datagrid的值,但我想自动删除重复的行。谁能帮我吗。我尝试过下面的方法,但没有成功。我正在使用MVVM。如何删除wpf datagrid中的重复行?

我的代码:

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

上述方法是添加行,但它不会删除重复的行自动。任何帮助将是非常可观的。

+0

你为什么不先验证行是否添加新的人之前已经存在? – sexta13 2014-09-01 10:46:14

+0

@ sexta13 ...你能详细说明一下吗? – user3262450 2014-09-01 10:50:18

+0

检查我的答案。 – sexta13 2014-09-01 10:54:16

回答

0

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

你的问题是在你的boolitemexists。

试试这个:

if (vlan.FirstOrDefault(YOUR_CONDITIONS) ==null) 
return false; 
else return true; 

YOUR_CONDITIONS我想,一定是这样的:

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

你boolexistsitem应该接收串口作为参数。

问候,

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

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;  
}   
+1

谢谢它的作品:) – user3262450 2014-09-01 12:30:11

1

您可以使用LinQEnumerable.Distinct<TSource> Method删除集合中的重复项目。尝试是这样的:

vlan = GetSomeData(); // Fill with data however you want 
vlan = new ObservableCollection<VLANSPropertyClass>(vlan.Distinct()); 

这甚至可以缩短为:

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

这只会努力消除确切的重复对象,但...这就是,共享相同的参考对象。如果您只想删除具有相同属性值的对象,则可以使用重载Enumerable.Distinct<TSource> Method,该参数取IEqualityComparer<T>参数。当然,你需要实现IEqualityComparer<T>界面才能正常工作。