2012-12-25 77 views
6

Tôi có một WPF DataGrid theDataGrid bị ràng buộc với một DataSet ds có chứa một bảng. Tôi muốn cho phép người sử dụng để loại bỏ các dòng bằng cách đầu tiên chọn chúng trong lưới điện và sau đó nhấn một nút (vị trí somwhere bên ngoài của DataGrid). Cuối cùng tôi đến các dòng mã sau đây mà làm những gì tôi muốn, nhưng mà tôi cân nhắc khá xấu xí:Xóa các hàng khỏi bảng dữ liệu WPF

DataSet ds = new DataSet(); 
     ... 
    // fill ds somehow 
     ... 
    private void ButtonClickHandler(object Sender, RoutedEventArgs e) 
    { 
     List<DataRow> theRows = new List<DataRow>(); 
     for (int i = 0; i < theDataGrid.SelectedItems.Count; ++i) 
     { 
      // o is only introduced to be able to inspect it during debugging 
      Object o = theDataGrid.SelectedItems[i]; 
      if (o != CollectionView.NewItemPlaceholder) 
      { 
       DataRowView r = (DataRowView)o; 
       theRows.Add(r.Row); 
      } 
     } 
     foreach(DataRow r in theRows) 
     {     
      int k = ds.Tables["producer"].Rows.IndexOf(r); 
      // don't remove() but delete() cause of update later on 
      ds.Tables[0].Rows[k].Delete(); 
     } 
    } 

Có cách nào tốt hơn để làm điều này? Ví dụ. một trong đó chỉ cần một vòng lặp và không cần phải kiểm tra NewItemPlaceHolder một cách rõ ràng, hoặc có thể một cách hiệu quả hơn để truy cập vào các hàng sẽ bị xóa?

(Tôi đã tìm ra rằng tôi không phải loại bỏ bất cứ điều gì từ ds trong vòng lặp đầu tiên, kể từ đó theDataGrid.SelectedItems.Count thay đổi mọi vòng lặp được thực hiện ...)

+0

tôi có giải pháp nào bạn muốn tôi thêm nó ?? – gasroot

Trả lời

0

Tôi nghĩ rằng nó hoạt động bằng cách chỉ là một vòng lặp:

int count=theDataGrid.SelectedItems.Count; 
int removedCount=0; 
while (removedCount < count) 
{ 
    try{ 
     Object o = theDataGrid.SelectedItems[0]; 
    } 
    catch{ break;} 

    if (o == CollectionView.NewItemPlaceholder) 
    continue; 

    DataRowView r = (DataRowView)o; 
    r.Row.Delete(); 
    removedCount++; 
} 
+0

Uhmm, cảm ơn nhưng không. Vòng lặp foreach mà bạn đã thêm sau khi 'Chỉnh sửa' là thực sự 'giải pháp' đầu tiên của tôi. Nó dẫn đến một ngoại lệ không được giải quyết. Đây là những gì tôi đã đề cập đến trong dòng cuối cùng của câu hỏi của tôi, một trong ngoặc đơn. Bộ sưu tập SelectedItems thay đổi trong vòng lặp và bộ đếm foreach đề cập đến một cái gì đó không hợp lệ (tôi nghĩ). Tôi mong đợi tương tự với cách tiếp cận đầu tiên. – Thomas

+0

@Thomas Bạn nói đúng về điều thứ hai, nhưng ít nhất tôi chắc chắn rằng 'Bộ sưu tập đã sửa đổi ngoại lệ' sẽ không được ném trong lần đầu tiên. – Ramin

+0

Nó bị treo vì bạn tăng chỉ mục mà cuối cùng trở nên lớn hơn (hiện tại) SelectedItems.Count. Nó có thể sẽ hoạt động nếu bạn truy xuất SelectedIndex [0] mỗi lần. Nhưng, thành thật mà nói, với một bộ đếm được cập nhật theo cách thủ công, nó không đẹp hơn mã của tôi. Những gì tôi muốn có là một lớp lót như gợi ý thứ hai của bạn, nhưng một trong đó không sụp đổ ;-) – Thomas

0

bạn có thể loại bỏ các vòng lặp đôi bằng cách lặp lại ngược:

private void ButtonClickHandler(object Sender, RoutedEventArgs e) { 
    for (int i = theDataGrid.SelectedItems.Count-1; i>=0; --i) 
     if (theDataGrid.SelectedItems[i] != CollectionView.NewItemPlaceholder) 
      ds.Tables[0].Rows[i].Delete(); 
    } 
1

để loại bỏ hàng đã chọn vào nút bấm bạn có thể thử:

private void ButtonClickHandler(object sender, RoutedEventArgs e)//Remove row selected 
    { 
     DataRowView dataRow = (DataRowView)dataGridCodes.SelectedItem; //dataRow holds the selection 
     dataRow.Delete();      
    } 
Các vấn đề liên quan