結合されたセルの選択時に結合前の各セルの値が編集コントロールにセットされる問題が残していました。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 件のコメント:
コメントを投稿