una - datagridview c# ejemplos
Agregar filas a datagridview con columnas existentes (2)
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.
¿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!
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 creas y configuras una nueva fila para "fila", por alguna extraña razón, se elimina el valor anterior. intente no usar una instancia para mantener las filas que crea:
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 las instancias de células. Aunque no tengo idea de por qué es diferente para las filas. Se pueden requerir más pruebas ...
Para ampliar esta pregunta, también hay otra forma de agregar una fila a DataGridView
, especialmente si las columnas son siempre las mismas:
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 te gusta 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());
Los valores en el búfer deben estar en el mismo orden que las columnas (incluidas las ocultas) 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 el Objeto intacto, si desea operar en la fila seleccionada, puede hacer esto: DatagridView está vinculado:
if(gridViewParts.CurrentRow != null)
{
SaleItem item = (SalteItem)(gridViewParts.CurrentRow.DataBoundItem);
// You can use item here without problems.
}
Se recomienda que las clases que se envíen implementen la interfaz System.ComponentModel.INotifyPropertyChanged
, que le permite informar a la grilla sobre los cambios.