|  | すっかり遅くなりました。すんません。 
 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;
 }
 }
 
 
 |