8

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

谢谢!

4

2 回答 2

7

只是为了扩展这个问题,还有另一种方法可以将一行添加到 a 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接口,这允许它告诉网格有关更改的信息。

于 2009-10-21T12:26:57.823 回答
3

编辑:哎呀!在第二行代码上犯了一个错误。- 解决它。

有时,我讨厌定义数据源属性。

我认为,每当您为“行”创建和设置新行时,出于某种奇怪的原因,旧值都会被处理掉。尝试不使用实例来保存您创建的行:

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

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

似乎单元格与单元格实例可以正常工作。我不知道为什么行不同。可能需要进行更多测试...

于 2009-05-20T09:24:39.790 回答