Adsense_top

2009年5月30日土曜日

C# DataGridView セルの結合 その3

C# DataGridView セルの結合 その2」の続きです。
結合されたセルの選択時に結合前の各セルの値が編集コントロールにセットされる問題が残していました。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 件のコメント:

コメントを投稿