2012-07-09 54 views
7

Tôi có một ứng dụng C# Windows Forms đơn giản sẽ hiển thị một DataGridView. Như DataBinding Tôi đã sử dụng một đối tượng (chọn một lớp được gọi là xe) và đây là những gì nó trông giống như:C# - DataGridView không thể thêm hàng?

class Car 
{ 
    public string color { get; set ; } 
    public int maxspeed { get; set; } 

    public Car (string color, int maxspeed) { 
     this.color = color; 
     this.maxspeed = maxspeed; 
    } 
} 

Tuy nhiên, khi tôi đặt DataGridView hữu AllowUserToAddRows để true, vẫn còn không ít * cho phép tôi thêm hàng.

Một người nào đó được đề xuất đặt carBindingSource.AllowAdd thành true, tuy nhiên, khi tôi làm điều đó, tôi nhận được MissingMethodException cho biết không thể tìm thấy hàm tạo của mình.

+0

Tôi nghĩ bạn sẽ cần một hàm tạo ít tham số (vì không có thông tin nào có sẵn để truyền cho hàm tạo 2 param của bạn), Bạn làm cách nào để ràng buộc nó? – V4Vendetta

+0

Tôi đã phải sử dụng AllowNew trên nguồn ràng buộc của mình. –

Trả lời

2

Bạn cần phải thêm AddingNew xử lý sự kiện:

public partial class Form1 : Form 
{ 
    private BindingSource carBindingSource = new BindingSource(); 



    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.DataSource = carBindingSource; 

     this.carBindingSource.AddingNew += 
     new AddingNewEventHandler(carBindingSource_AddingNew); 

     carBindingSource.AllowNew = true; 



    } 

    void carBindingSource_AddingNew(object sender, AddingNewEventArgs e) 
    { 
     e.NewObject = new Car(); 
    } 
} 
7

class Car của bạn cần phải có một constructor parameterless và nhu cầu nguồn dữ liệu của bạn có một cái gì đó giống như một BindingList

Thay đổi class Car thế này:

class Car 
{ 
    public string color { get; set ; } 
    public int maxspeed { get; set; } 

    public Car() { 
    } 

    public Car (string color, int maxspeed) { 
     this.color = color; 
     this.maxspeed = maxspeed; 
    } 
} 

Và sau đó gắn một cái gì đó như thế này:

BindingList<Car> carList = new BindingList<Car>(); 

dataGridView1.DataSource = carList; 

Bạn cũng có thể sử dụng một BindingSource cho điều này, bạn không phải nhưng BindingSource cung cấp một số chức năng bổ sung mà đôi khi có thể cần thiết.


Nếu vì một số lý do bạn hoàn toàn không thể thêm các nhà xây dựng parameterless sau đó bạn có thể xử lý các sự kiện mới bổ sung của nguồn ràng buộc và gọi xe parameterised constructor:

Thiết lập các ràng buộc:

BindingList<Car> carList = new BindingList<Car>(); 
BindingSource bs = new BindingSource(); 
bs.DataSource = carList; 
bs.AddingNew += 
    new AddingNewEventHandler(bindingSource_AddingNew); 

bs.AllowNew = true; 
dataGridView1.DataSource = bs; 

Và mã handler:

void bindingSource_AddingNew(object sender, AddingNewEventArgs e) 
{ 
    e.NewObject = new Car("",0); 
} 
+1

BindingList đã giải quyết được vấn đề của tôi. 'dataGridView1.DataSource = new BindingList (carList);' – styfle

1

tôi thời gian gần đây phát hiện ra rằng nếu bạn triển khai danh sách ràng buộc của riêng mình bằng cách sử dụng IBindingList, bạn PHẢI trả lại true trong số SupportsChangeNotification của bạn ngoài AllowNew.

Bài viết MSDN cho DataGridView.AllowUserToAddRows chỉ xác định nhận xét sau đây tuy nhiên:

Nếu DataGridView là ràng buộc để dữ liệu, người dùng được phép thêm hàng nếu cả hai thuộc tính này và tài sản IBindingList.AllowNew nguồn dữ liệu của là đặt thành true.

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