2012-01-03 121 views
10

Antes que nada, busqué esta pregunta relacionada en here pero la solución dataGridView1.Rows.Add() no funciona en mi caso.Las filas no se pueden agregar mediante programación a la colección de filas de Datagridview cuando el control está vinculado a datos

En mi Datagridview, tengo 3 TextBoxes para la entrada de datos y 2 ComboBoxes para que el usuario elija los valores (que están vinculados a la base de datos). Uno de mis TextBoxes está configurado para leer solo para que los usuarios solo puedan poblarlo fuera de la cuadrícula de datos (con un TexBox normal y un Botón).

Cuando los usuarios llenan un DataGridView con datos, siempre hay una fila vacía en la parte inferior; por lo que la desactiva y he utilizado este código para evitar que los usuarios agreguen una nueva fila dentro de la cuadrícula de datos ...

dataGridView1.AllowUserToAddRows = false 

Yo sólo quiero añadir una nueva fila cuando los usuarios hacen clic en el botón que he mencionado anteriormente (que arroja un error).

El mensaje de error que obtuve fue:

"Filas no se pueden agregar mediante programación a la recolección de la fila del DataGridView cuando el control está enlazado a datos"

sample image el que tiene una flecha roja es un ComboBox, y el que tiene una flecha verde es de solo lectura. Cuadro de texto

+5

Añadir una fila a la fuente de datos – sq33G

+0

¿Está utilizando la propiedad .DataSource? –

Respuesta

20

Parece que está utilizando la propiedad DataSource de DataGridView. Cuando esta propiedad se utiliza para enlazar datos, no se pueden agregar filas explícitamente directamente a DataGridView. En su lugar, debe agregar filas directy a su fuente de datos.

Por ejemplo, si el origen de datos es un DataTable, utilizando el DataTable que se asigna a la propiedad DataSource (no probado):

private void AddARow(DataTable table) 
{ 
    // Use the NewRow method to create a DataRow with 
    // the table's schema. 
    DataRow newRow = table.NewRow(); 

    // Add the row to the rows collection. 
    table.Rows.Add(newRow); 
} 
+2

Tenga en cuenta que también puede agregar en la parte superior: 'dt.Rows.InsertAt (fila, 0);' – TaW

1

Después de agregar una nueva fila, debe establecer el índice de la fila en el límite del recuento de filas. Tienes que seguir estos pasos.

  1. En primer lugar, añadir fila de DataGridView:

    dataGridView1.Rows.Add(); 
    
  2. En segundo lugar, establecer nuevo índice de la fila de contar - 1:

    int RowIndex = dataGridView1.RowCount - 1; 
    
  3. Entonces, por fin, establecer los valores de los controles en it:

    DataGridViewRow R = dataGridView1.Rows[RowIndex]; 
    R.Cells["YourName"].Value = tbName.Text; 
    

Y si el origen de su cuadrícula de datos es datatable, debe agregar una fila en esa tabla. Dar nuevos valores a la fila recién agregada en la tabla de datos y, al final, volver a enlazar la cuadrícula de datos con la tabla de datos actualizada.

DataRow row = dt.NewRow(); 
    row["columnname"] = tbName.Text.toString(); 
    dt.Rows.Add(row); 
    dt.AcceptChanges(); 

    dataGridView1.DataSource = dt; 
    dataGridView1.DataBind(); 

Comprobar si ha configurado el índice de la nueva fila correctamente. Quizás es por eso que está obteniendo este error.

+1

Hola Syeda, recién ahora probé tu método. en modo de depuración, el error ocurre cuando ingresa al primer paso, que es 'dataGridView1.Rows.Add();' –

+1

di muestras tanto para gridview como para la tabla de datos. Intentó la muestra dada para la vista de cuadrícula mientras usaba la tabla de datos. – Syeda

0

El Datagridview Bound tiene un problema que cuando se quiere añadir sus datos mediante programación impide que lo agregue directamente.Así que la forma indirecta y la mejor manera de añadir datos es así .. y recuerde que nunca añadir datos directamente a DataGridView mediante programación, ya que crean un problema siempre, añadir datos a su fuente de datos en lugar :-)

code for VB.NET 
Dim r As DataRow (C# : Datarow r=new Datarow() below codes apply to C# also) 
r = dataset.Tables(0).NewRow 
r.Item("field1") = "2" 
r.Item("field2") = "somevalue" 
dataset.Tables(0).Rows.Add(r) 

dataset.Tables(0).acceptchanges() 

the update will goes as you do ever 
0

La mejor solución que encontré :

//create datatable and columns 
DataTable dtable = new DataTable(); 
dtable.Columns.Add(new DataColumn("Column 1")); 
dtable.Columns.Add(new DataColumn("Column 2")); 

//simple way create object for rowvalues here i have given only 2 add as per your requirement 
object[] RowValues = { "", "" }; 

//assign values into row object 
RowValues[0] = "your value 1"; 
RowValues[1] = "your value 2"; 

//create new data row 
DataRow dRow; 
dRow = dtable.Rows.Add(RowValues); 
dtable.AcceptChanges(); 

//now bind datatable to gridview... 
gridview.datasource=dtable; 
gridview.databind(); 

Fuente: http://www.codeproject.com/Questions/615379/Adding-rows-to-datagridview-with-existing-columns

2

puede obtener el DataGridView 's DataSource y proyectarlo como un DataTable.

A continuación, agregue un nuevo DataRow y establecer los valores de los campos.

Agregar la nueva fila a la DataTable y acepta los cambios.

En C# sería algo como esto:

DataTable dataTable = (DataTable)dataGridView.DataSource; 
DataRow drToAdd = dataTable.NewRow(); 

drToAdd["Field1"] = "Value1"; 
drToAdd["Field2"] = "Value2"; 

dataTable.Rows.Add(drToAdd); 
dataTable.AcceptChanges(); 
+0

Esta es la mejor solución si ha enlazado la 'DataTable' al 'DataGridView' en otro método y' DataTable' no es una variable pública. ¡Bien pensado! –

Cuestiones relacionadas