web-dev-qa-db-ja.com

既存の列を使用してdatagridviewに行を追加する

いくつかの列が作成された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;
}

ありがとう!

8
Nacho

この質問を拡張するために、特に列が常に同じである場合は、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インターフェイスを実装することをお勧めします。これにより、グリッドに変更を通知できます。

5
Bobby

編集:おっと!コードの2行目を間違えました。-修正しました。

データソースプロパティの定義が嫌いな場合があります。

「行」に新しい行を作成して設定するたびに、奇妙な理由で古い値が破棄されると思います。作成した行を保持するためにインスタンスを使用しないようにしてください。

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

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

セルはセルインスタンスで正常に機能しているようです。しかし、なぜそれが行で異なるのか私にはわかりません。さらにテストが必要になる場合があります...

3
random dude