2014-09-01 84 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>界面才能正常工作。