2008-10-07 116 views
5

Tôi đang sử dụng VS 2008/C# và ràng buộc một Danh sách địa phương của các lớp trợ giúp như là DataSource cho một điều khiển DataGridView. Việc gọi phương thức Remove() trong danh sách các lớp trợ giúp của tôi sẽ kích hoạt sự kiện CellFormatting của DataGridView, điều này có ý nghĩa (một chút).Xóa hàng cuối Databound DataGridView C#

Khi loại bỏ bất kỳ điều gì xảy ra là DataBoundItem của hàng cuối cùng trong lưới (miễn là lưới có nhiều hàng) bộ sưu tập hàng của DataGridView không được cập nhật trước khi sự kiện này kích hoạt. Vì vậy, trong xử lý sự kiện CellFormatting, tôi nhận được một IndexOutOfRangeException khi bộ sưu tập hàng là một quá lớn.

Tôi đã thử xóa hàng bằng phương thức DataGridView.Rows.Remove() và ràng buộc bằng cách sử dụng BindingSource thay vì gắn kết Danh sách trực tiếp dưới dạng nguồn dữ liệu.

Tôi đã tìm thấy một vài tham chiếu đến sự cố này qua Google, nhưng câu trả lời không được sắp tới hoặc được cho là sử dụng phương thức Delete() trên DataGridView hoặc bộ sưu tập DataGridView.Rows - hiện không tồn tại.

Sắp xếp có vẻ không phải là vấn đề, vì thực hiện/không thực hiện kết quả sắp xếp trong cùng một kết quả.

Ngoại lệ duy nhất cho "hàng cuối cùng" là một vấn đề cần xóa là nếu DataGridView chỉ chứa một hàng - trong trường hợp đó mọi thứ đều hoạt động tốt.

Trả lời

10

Tôi đã gặp sự cố này trong quá khứ và nếu tôi nhớ chính xác có một trong hai điều bạn có thể làm. Khi bạn xóa bản ghi khỏi bộ sưu tập, hãy đặt thuộc tính nguồn dữ liệu trên datagridview thành null và sau đó rebind nó vào danh sách của bạn. Điều đó sẽ làm các trick.

Ngoài ra, bạn có thể xử lý sự kiện DataError trên dữ liệu của bạnGridview và trong phương pháp bạn có thể nói e.Cancel = true để loại bỏ ngoại lệ, hoặc bạn có thể tiếp tục xử lý nó ở đó.

+0

đặt thành rỗng và quay lại bộ sưu tập đã hoạt động. – Pat

+0

Gắn cờ câu trả lời này là câu trả lời ngoại trừ về câu hỏi cũ điên rồ. :-) Tôi tin rằng tôi đã thử đề xuất không thành công vào thời điểm đó. Nhưng nó dường như đã làm việc cho người khác. –

0

Đây là một vấn đề rất cũ, nhưng tôi đã giải quyết nó bằng cách xử lý sự kiện xóa hàng, như sau.

private void dgViewItems_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) 
{ 
    dataAdapter.Update((DataTable)bindingSource1.DataSource); 
} 

và hoạt động.

0

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã tìm thấy một giải pháp khác phù hợp với tôi. Trước khi xóa mục khỏi nguồn dữ liệu/nguồn ràng buộc, hãy bỏ dây xử lý sự kiện cho sự kiện CellFormatting và sau đó kết nối lại nó sau đó. Ví dụ:

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
Me.BindingSource1.Remove(item) 
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
0

Tôi gặp vấn đề tương tự. Tôi đã tìm ra một giải pháp. Cố gắng sao chép tất cả các hàng sang hàng kế tiếp. sau đó loại bỏ hàng đầu tiên của dgv. Một mã mẫu cho việc này:

If Dgv.CurrentCell.RowIndex + 1 = Dgv.Rows.Count Then 
     For m = Dgv.Rows.Count - 2 To 0 Step -1 
      Dgv.Rows(m + 1).Cells(0).Value = Dgv.Rows(m).Cells(0).Value 
      Dgv.Rows(m + 1).Cells(1).Value = Dgv.Rows(m).Cells(1).Value 
      Dgv.Rows(m + 1).Cells(2).Value = Dgv.Rows(m).Cells(2).Value 
      Dgv.Rows(m + 1).Cells(3).Value = Dgv.Rows(m).Cells(3).Value 

     Next 
     Dgv.Rows.RemoveAt(0) 
     Exit Sub 
    End If 
    Dgv.Rows.Remove(Dgv.CurrentRow) 

thử nó :)

2

Để ẩn hàng cuối cùng, thay đổi AllowUserToAddRows tài sản của datagridview như:

myDataGridView1.AllowUserToAddRows = false 
1

Đầu tiên chỉ vô hiệu hóa các tài sản của Datagridview

dataGridView1.AllowUserToAddRows = false; 

và sau đó chỉ xóa hàng cuối cùng với nhiều hàng bạn muốn e ither với vòng lặp bằng cách giữ -1.

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
Các vấn đề liên quan