2008-09-29 21 views
7

Tengo un DataGridView con varias columnas creadas. He agregado algunas filas y se muestran correctamente; sin embargo, cuando hago clic en una celda, el contenido desaparece.Agregar filas a Datagridview con columnas existentes

¿Qué estoy haciendo mal?

El código es el siguiente:

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

Gracias!

+0

Tengo una publicación aquí eliminé, estaba relacionada con asp.net ya que no hago ninguna programación de winforms y lo tomé como asp.net. perdón por eso en caso de que lo leas y te engañes un poco. – mattlant

+0

Bien, gracias. De todos modos, no lo vi. – Nacho

Respuesta

3

Editar: ¡Uy! cometió un error en la segunda línea de código. - arreglado.

A veces, odio definir la propiedad del origen de datos.

Creo que cada vez que crea y establece una nueva fila para "fila", por algún extraño motivo, se elimina el valor anterior. trate de no usar una instancia para mantener las filas que se crean:

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

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

Parece que las células funcionan bien con los casos de células. Aunque no tengo idea de por qué es diferente para las filas. Más testeos pueden ser necesarios ...

+1

Esto me solucionó el problema. –

4

Sólo para extender esta cuestión, también hay otra forma de agregar una fila a una DataGridView, especialmente si las columnas son siempre los mismos:

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()); 

O si lo desea ParamArray:

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()); 

los valores en la memoria intermedia necesitan estar en el mismo orden que las columnas (incluyendo los ocultos) obviamente.

Esta es la forma más rápida que encontré para obtener datos en un DataGridView sin vincular la cuadrícula con un DataSource. Encuadernar la grilla en realidad la acelerará en una cantidad de tiempo significativa, y si tiene más de 500 filas en una grilla, recomiendo atarla en lugar de llenarla con la mano.

El enlace también viene con la ventaja de que puede mantener intacto el objeto, es decir, si se quiere operar en la fila seleccionada, usted puede hacer esto es el DataGridView está obligado:

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

Se aconseja que las clases que obtienen cota no implementan la interfaz System.ComponentModel.INotifyPropertyChanged, lo que le permite contar la rejilla sobre cambios.

Cuestiones relacionadas