結合されたセルの選択時に結合前の各セルの値が編集コントロールにセットされる問題が残していました。Excelなどでセルを結合させると左上端のセルの値を保持し、それ以外のセルの値は空にしているのに倣おうと思います。つまり、結合されたセル範囲で上端セルに値を保持します。編集は、そのセルに対して編集処理を行います。
「C# DataGridView セルの結合 その2」の「DgvMergebleTextBoxCell」クラスに追加します。
public override void InitializeEditingControl( int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); DataGridViewTextBoxEditingControl ctl = this.DataGridView.EditingControl as DataGridViewTextBoxEditingControl; // 結合された列の上端の行インデックスを算出しセルを取得 int row = (rowIndex / mergeRows) * mergeRows; DataGridViewCell cell = this.DataGridView[ColumnIndex, row]; // 初期化した編集コントロールに、 // 結合された列の上端セルの値を代入 ctl.Text = Convert.ToString(cell.Value); }
上記コードは、編集コントロールの初期化時に、結合セル範囲の上端セルの値を編集コンロロールの編集初期値として設定するようにオーバーライドしています。
protected override object GetValue(int rowIndex) { if(rowIndex % mergeRows == 0) { // 結合された列の上端行のセルの場合のみ値を返す return base.GetValue(rowIndex); } else { // 結合された列の上端行のセル以外の場合は、null値を返す return null; } } protected override bool SetValue(int rowIndex, object value) { if(this.DataGridView == null || rowIndex % mergeRows == 0) { // DataGridViewにまだ追加されていないセルの場合と // 結合された列の上端行セルの場合は通常通り値を設定します。 return base.SetValue(rowIndex, value); } else { try { // 結合された列の上端行のインデックスを計算 int topRowIndex = (rowIndex / mergeRows) * mergeRows; // DataGridViewにすでに追加されていて、結合された列の // 上端行以外のセルの場合、結合された列の上端行のセルに // 値を設定します。 this.DataGridView[this.ColumnIndex, TopRowIndex(rowIndex)].Value = value; return true; } catch(Exception ex) { // 何らかのエラーが発生した場合は、falseを返します。 return false; } } }
続いて、結合セル範囲の上端セルに値が集中するようにしました。また、その他のセルでは、空の値を返すように、基本クラスのメソッドをオーバーライドしました。
今日はここまでにします。見た目的に、あまり変化がなく面白くないので、次回は表示に関する描画部を考えて見ようと思っています。
0 件のコメント:
コメントを投稿