2008-09-29 36 views
7

Tôi có một số DataGridView với một số cột được tạo. Tôi đã thêm một số hàng và chúng được hiển thị chính xác; tuy nhiên, khi tôi nhấp vào một ô, nội dung sẽ biến mất.Thêm hàng vào chế độ xem dữ liệu với các cột hiện có

Tôi đang làm gì sai?

Mã này là như sau:

foreach (SaleItem item in this.Invoice.SaleItems) 
{ 
    DataGridViewRow row = new DataGridViewRow(); 
    gridViewParts.Rows.Add(row); 

    DataGridViewCell cellQuantity = new DataGridViewTextBoxCell(); 
    cellQuantity.Value = item.Quantity; 
    row.Cells["colQuantity"] = cellQuantity; 

    DataGridViewCell cellDescription = new DataGridViewTextBoxCell(); 
    cellDescription.Value = item.Part.Description; 
    row.Cells["colDescription"] = cellDescription; 

    DataGridViewCell cellCost = new DataGridViewTextBoxCell(); 
    cellCost.Value = item.Price; 
    row.Cells["colUnitCost1"] = cellCost; 

    DataGridViewCell cellTotal = new DataGridViewTextBoxCell(); 
    cellTotal.Value = item.Quantity * item.Price; 
    row.Cells["colTotal"] = cellTotal; 

    DataGridViewCell cellPartNumber = new DataGridViewTextBoxCell(); 
    cellPartNumber.Value = item.Part.Number; 
    row.Cells["colPartNumber"] = cellPartNumber; 
} 

Cảm ơn!

+0

Tôi có một bài đăng trên đây tôi đã xóa, đó là liên quan đến asp.net như tôi không làm bất kỳ chương trình winforms và mistook này như asp.net. xin lỗi về điều đó trong trường hợp bạn đọc nó và đánh lừa bạn một chút. – mattlant

+0

Ok cảm ơn, Dù sao tôi không nhìn thấy nó. – Nacho

Trả lời

3

Chỉnh sửa: oops! đã phạm sai lầm trên dòng mã thứ hai. - cố định nó.

Đôi khi, tôi ghét xác định thuộc tính nguồn dữ liệu.

Tôi nghĩ rằng bất cứ khi nào bạn tạo và đặt hàng mới cho "hàng", vì một lý do kỳ lạ nào đó, giá trị cũ được xử lý. cố gắng không sử dụng một thể hiện để giữ các hàng bạn tạo:

int i; 
i = gridViewParts.Rows.Add(new DataGridViewRow()); 

DataGridViewCell cellQuantity = new DataGridViewTextBoxCell(); 
cellQuantity.Value = item.Quantity; 
gridViewParts.Rows[i].Cells["colQuantity"] = cellQuantity; 

Dường như các ô hoạt động tốt với các thể hiện ô. Tôi không có ý tưởng tại sao nó là khác nhau cho các hàng mặc dù. Nhiều xét nghiệm có thể được yêu cầu ...

+1

Điều này đã khắc phục được sự cố cho tôi. –

4

Chỉ cần để mở rộng câu hỏi này, cũng có một cách khác để thêm một hàng vào một DataGridView, đặc biệt là nếu các cột luôn luôn giống nhau:

object[] buffer = new object[5]; 
List<DataGridViewRow> rows = new List<DataGridViewRow>(); 
foreach (SaleItem item in this.Invoice.SaleItems) 
{ 
    buffer[0] = item.Quantity; 
    buffer[1] = item.Part.Description; 
    buffer[2] = item.Price; 
    buffer[3] = item.Quantity * item.Price; 
    buffer[4] = item.Part.Number; 

    rows.Add(new DataGridViewRow()); 
    rows[rows.Count - 1].CreateCells(gridViewParts, buffer); 
} 
gridViewParts.Rows.AddRange(rows.ToArray()); 

Hoặc nếu bạn thích ParamArrays:

List<DataGridViewRow> rows = new List<DataGridViewRow>(); 
foreach (SaleItem item in this.Invoice.SaleItems) 
{ 
    rows.Add(new DataGridViewRow()); 
    rows[rows.Count - 1].CreateCells(gridViewParts, 
     item.Quantity, 
     item.Part.Description, 
     item.Price, 
     item.Quantity * item.Price, 
     item.Part.Number 
    ); 
} 
gridViewParts.Rows.AddRange(rows.ToArray()); 

Giá trị trong bộ đệm cần phải theo cùng thứ tự như các cột (bao gồm cả các ẩn) rõ ràng.

Đây là cách nhanh nhất tôi tìm thấy để nhận dữ liệu vào DataGridView mà không ràng buộc lưới đối với DataSource. Ràng buộc lưới sẽ thực sự tăng tốc nó lên một khoảng thời gian đáng kể, và nếu bạn có nhiều hơn 500 hàng trong một lưới, tôi khuyên bạn nên ràng buộc nó thay vì điền nó bằng tay.

Ràng buộc cũng đi kèm với phần thưởng mà bạn có thể giữ cho đối tượng không đổi, ví dụ: nếu bạn muốn để hoạt động trên hàng đã chọn, bạn có thể làm điều này là DataGridView là ràng buộc:

if(gridViewParts.CurrentRow != null) 
{ 
    SaleItem item = (SalteItem)(gridViewParts.CurrentRow.DataBoundItem); 
    // You can use item here without problems. 
} 

Đó là thông báo rằng lớp học của bạn mà có được ràng buộc làm thực hiện các giao diện System.ComponentModel.INotifyPropertyChanged, cho phép nó nói với lưới điện về thay đổi.

Các vấn đề liên quan