|
すっかり遅くなりました。すんません。
UserControl継承して、コンポジションでやるとこんな感じでしょうか。 this.grdMainはDataGridViewですよ。 RecordSettingsGridView.Designer.csは省略です。 必要なイベント・プロパティは自分で用意しなくてはなりませんね。
public partial class RecordSettingsGridView : UserControl { // 編集しないデータ private Records recordsOrg_;
// 編集用のデータ private Records records_;
// コンストラクタ public RecordSettingsGridView() { InitializeComponent(); this.InitDataGridView(); this.AddColumns(); }
// グリッドの設定 private void InitDataGridView() { this.grdMain.VirtualMode = true; this.grdMain.AllowUserToAddRows = false; this.grdMain.AllowUserToDeleteRows = false; this.grdMain.EnableHeadersVisualStyles = false; }
// 編集するデータ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Records Records { get { return this.records_; } set { this.recordsOrg_ = value; this.records_ = value == null ? null : value.Clone() as Records;
this.grdMain.Rows.Clear(); this.grdMain.RowCount = value == null ? 1 : value.Count; } }
// 列を追加 private void AddColumns() { this.grdMain.Columns.Clear();
DataGridViewTextBoxColumn colName = new DataGridViewTextBoxColumn(); colName.HeaderText = "名前"; colName.Name = "colName"; colName.ValueType = typeof(string); this.grdMain.Columns.Add(colName);
DataGridViewTextBoxColumn colAge = new DataGridViewTextBoxColumn(); colAge.HeaderText = "年齢"; colAge.Name = "colAge"; colAge.ValueType = typeof(int); this.grdMain.Columns.Add(colAge);
DataGridViewCheckBoxColumn colSex = new DataGridViewCheckBoxColumn(); colSex.HeaderText = "性別"; colSex.Name = "colSex"; colSex.ValueType = typeof(bool); this.grdMain.Columns.Add(colSex); }
// データが必要になった private void grdMain_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { int colIndex = e.ColumnIndex; int rowIndex = e.RowIndex;
// ありえないセルならば何もしない if (this.grdMain.ColumnCount <= colIndex) return; if (this.grdMain.RowCount <= rowIndex) return;
string colName = this.grdMain.Columns[colIndex].Name; switch (colName) { // 名前 case "colName": e.Value = this.Records[rowIndex].Name; break;
// 年齢 case "colAge": e.Value = this.Records[rowIndex].Age; break;
// 性別 case "colSex": e.Value = this.Records[rowIndex].Sex; break;
default: break; }
return; }
// セルの値を保存 private void grdMain_CellValuePushed(object sender, DataGridViewCellValueEventArgs e) { int colIndex = e.ColumnIndex; int rowIndex = e.RowIndex;
// ありえないセルならば何もしない if (this.grdMain.ColumnCount <= colIndex) return; if (this.grdMain.RowCount <= rowIndex) return;
string colName = this.grdMain.Columns[colIndex].Name; switch (colName) { // 名前 case "colName": this.Records[rowIndex].Name = (string)e.Value; break;
// 年齢 case "colAge": this.Records[rowIndex].Age = (int)e.Value; break;
// 性別 case "colSex": this.Records[rowIndex].Sex = (bool)e.Value; break;
default: break; }
return; } }
|