1

カスタムオブジェクトをDataTable'sの各セルに関連付けてDataRow、DataGridViewから取得したイベントで、色付けやその他の動作をカスタマイズできるようにします。したがって、新しい行を追加するときは、次のようにします。

  DataRow oRow = dtItens.NewRow();
  oRow["CodFamilia"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
  oRow["Familia"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
  oRow["Item"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
  oRow["Descricao"] = new ClsCelula(TipoCelula.tcMostrar, "", Color.White);
  oRow["Referencia"] = new ClsCelula(TipoCelula.tcMostrar, "Saldo Inicial", Color.Aqua);
  dtItens.Rows.Add(oRow);

DataGridViewのCellFormattingイベントで、次のようにClsCelulaオブジェクトにそのプロパティを読み取らせたいと思います。

Object oCelula = dtItens.Rows[e.RowIndex][e.ColumnIndex];
if (oCelula != null)
{
  if (oCelula is ClsCelula)
  {
    ClsCelula oValorCelula = (ClsCelula)oCelula;
    e.CellStyle.BackColor = oValorCelula.Cor;
  }
}

ただし、行/列のインデックスを読み取るときにコードが呼び出している可能性があるため、これは機能しません。ToString()したがって、oCelulaは常にSystem.String。です。これを回避する方法はありますか?「実際の」オブジェクトにアクセスするにはどうすればよいですか?

4

4 に答える 4

2

DataTableオブジェクトモデルから作業しているので、ここですべてを使用する必要はないようです。を(またはそれ以上:)に設定するだけで、すぐDataSourceに使用できます。オブジェクトへのバインドは完全に満足しており、基になるオブジェクトは各行にあります。List<T>BindingList<T>DataGridView.DataBoundItem

注-双方向のデータバインディングの場合(つまり、コードを介してオブジェクトを直接編集するときにグリッドを更新する場合)、使用BindingList<T> して実装することをお勧めしますINotifyPropertyChanged-ただし、リストを表示するだけの場合は、これは必要ありません。グリッドを介してアイテムを編集します。

于 2011-02-13T23:00:52.650 に答える
1

ここにいくつかのオプション:

  • DataTable独自のオブジェクトから作成しDataColumn、各列のオブジェクトタイプをとして指定しますClsCelula。この場合、グリッド用にフォーマットする際に問題が発生します。
  • 作成されたオブジェクトごとに2番目の非表示、つまりシャドウ列を作成し、オブジェクトのインデックスをその中に配置します。インデックスDictionary<int, ClsCelula>は、作成および維持する必要のあるある種の自動インクリメント番号になります。
  • マークがコメントで言うことをしなさい。それはあなたがここでできる最高のことです。
于 2011-02-13T22:17:35.400 に答える
0

私は自分のコードでそのようなものを見つけました:dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value。それを特定のタイプにキャストする必要があるかもしれません。

于 2011-02-13T22:09:03.797 に答える
0

古い質問ですが、とにかく:

DataGridRecord obj = (DataGridRecord)Rows[args.RowIndex].DataBoundItem;
于 2018-03-23T08:55:34.527 に答える