2012-07-09 26 views
7

Tengo una aplicación simple de Windows Forms que debe mostrar un DataGridView. Como DataBinding utilicé un objeto (seleccionado una clase llamada Car) y esto es lo que parece:C# - DataGridView no puede agregar fila?

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

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

Sin embargo, cuando me puse la propiedad DataGridView AllowUserToAddRows a true, todavía no existe un pequeño * que me permite agregar filas

Alguien sugirió establecer carBindingSource.AllowAdd a true, sin embargo, cuando lo hago, me sale un MissingMethodException que dice mi constructor no se pudo encontrar.

+0

Creo que necesitará un parámetro menos constructor (ya que no hay información disponible para pasar a su constructor de 2 parámetros), ¿cómo lo vincula? – V4Vendetta

+0

Tuve que usar AllowNew en mi fuente de enlace. –

Respuesta

2

es necesario agregar AddingNew controlador de eventos:

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

Su clase de coche tiene que tener un constructor sin parámetros y sus necesidades de origen de datos sea algo así como un BindingList

cambiar la clase de coches para esto:

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; 
    } 
} 

Y a continuación, enlazar algo como esto:

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

dataGridView1.DataSource = carList; 

También puede usar un BindingSource para esto, no tiene que hacerlo, pero BindingSource brinda algunas funciones adicionales que a veces pueden ser necesarias.


Si por alguna razón usted no puede añadir el constructor sin parámetros, entonces usted puede manejar el nuevo evento adición del origen de enlace y llamar al fabricante de automóviles de parametrizado:

La creación de la unión:

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; 

Y el código del controlador:

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

BindingList resolvió mi problema. 'dataGridView1.DataSource = new BindingList (carList);' – styfle

1

recientemente descubrió que si implementa su propia lista de enlaces utilizando IBindingList DEBE devolver true en su SupportsChangeNotification además de AllowNew.

El artículo MSDN para DataGridView.AllowUserToAddRows sólo especifica sin embargo, la siguiente observación:

Si el DataGridView está enlazado a datos, el usuario tiene permiso para agregar filas si ambas propiedad del inmueble, IBindingList.AllowNew de la fuente de datos son establecido en verdadero.

Cuestiones relacionadas