[英]Adding rows to datagridview with existing columns
我有一个DataGridView
与几个创建列。 我添加了一些行,它们正确显示; 但是,当我点击一个单元格时,内容就会消失。
我究竟做错了什么?
代码如下:
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;
}
谢谢!
只是为了扩展这个问题,还有另一种向DataGridView
添加行的方法,特别是如果列总是相同的话:
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());
或者如果你喜欢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());
缓冲区中的值显然需要与列(包括隐藏的列)的顺序相同。
这是我发现将数据放入DataGridView
而不将数据绑定到DataSource
的最快方法。 绑定网格实际上会加速它大量的时间,如果你在网格中有超过500行,我强烈建议绑定它而不是手工填充它。
绑定也带有奖励,你可以保持对象的机智,如果你想操作选定的行,你可以这样做是DatagridView绑定:
if(gridViewParts.CurrentRow != null)
{
SaleItem item = (SalteItem)(gridViewParts.CurrentRow.DataBoundItem);
// You can use item here without problems.
}
建议您绑定的类确实实现System.ComponentModel.INotifyPropertyChanged
接口,该接口允许它告知网格有关更改。
编辑:哎呀! 在第二行代码上犯了一个错误。 - 修复。
有时,我讨厌定义数据源属性。
我认为每当你为“行”创建并设置一个新行时,由于一些奇怪的原因,旧的值会被处理掉。 尝试不使用实例来保存您创建的行:
int i;
i = gridViewParts.Rows.Add( new DataGridViewRow());
DataGridViewCell cellQuantity = new DataGridViewTextBoxCell();
cellQuantity.Value = item.Quantity;
gridViewParts.Rows[i].Cells["colQuantity"] = cellQuantity;
看起来细胞与细胞实例一起工作正常。 我不知道为什么行不同。 可能需要更多测试......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.