関係のあるデータを複数箇所で管理する場合
上記のようなことになった場合、まずはデータを
1,ベースとなるデータ
2,ベースを加工して使用するデータ(利用側)
に分けて考える。その上で、
利用側データに対応するベースデータへの参照を持たせる(リンクを張る)
ベースとなるデータは並び変えや削除などは行わない。操作はレコードの追加
のみとする。
例)
DataGridViewにて、ソート処理と表示抽出処理を行う場合には
ベースデータと表示データの2種類に分けられる。
処理的には
・表示するデータ(ベース)
・ソート後のデータ
・表示抽出フィルタ実行後のデータ
が考えられる。
この内、ソート後データとフィルタ実行後のデータは1つにできそう。
class CustomDataGridView { private DataGridView inner_grid; //内部データレコード public class RecordData { //フィールド定義 } //表示用データ public class DispInfo { public RecordData refRec; //ベースレコードへの参照 public bool visible; //表示フラグ フィルタ処理結果 } //List<>型でSortできたっけ? private List<RecordData> inner_base_data; //ベースデータ private List<DispInfo> disp_data; //表示データ //ヘッダクリックイベント 引数・内部処理は適当 public void CustomDataGridView_HeaderColumnMouseClick(Object sender, EventArgs e) { RecordDataSorter sorter = (DefaultSorter)inner_grid.Columns[e.ColumnIndex].Tag disp_data.sort(sorter); //加工データ構造に対してソート } //表示イベント 引数・内部処理は適当 public void CustomDataGridView_CellValueNeeded(Object sender, EvantArgs e) { if(disp_data[e.RowIndex].visible) //表示する { RecordData rec = disp_data[e.RowIndex].refRec; //参照先ベースレコード inner_grid.Rows[e.RowIndex].Value = rec.Value; //表示 } } }