Adsense_top

2009年6月5日金曜日

C# DataGridView セルの結合 その4

前回の続きです。「ここ」に「C# DataGridView セルの結合 その3」で書き忘れていたコードがありましたので追加しています。
今回は、描画の部分を考えました。」
「DgvMergebleTextBoxCell」クラスでPaintメソッドをオーバーライドしています。
結合されたどのセルを選択されても、結合セルのグループの上端セルの値を取ってきて表示するようにしています。
protected override void Paint(Graphics graphics,
  Rectangle clipBounds,
  Rectangle cellBounds,
  int rowIndex,
  DataGridViewElementStates cellState,
  object value, object formattedValue,
  string errorText,
  DataGridViewCellStyle cellStyle,
  DataGridViewAdvancedBorderStyle advancedBorderStyle,
  DataGridViewPaintParts paintParts) {

  Rectangle rect = cellBounds;
  int topRowIndex = TopRowIndex(rowIndex);
  bool isPrint = true;
  object topFormattedValue = null;
  object topValue = null;
  for(int i = 0; i < mergeRows; i++) {
    // 端数行がある場合、マージ行数より少ない行でも表示を
    // 行うために結合行数以下で切り上げる
    if(topRowIndex + i >= this.DataGridView.Rows.Count) {
      break;
    }
    DataGridViewCell cell =
    this.DataGridView[ColumnIndex, topRowIndex + i];
    if(i == 0) {
      // 結合行の最上端セルの値を取得
      topFormattedValue = cell.FormattedValue;
      topValue = cell.Value;
    }
    if(!cell.Equals(this) && !cell.OwningRow.IsNewRow) {
      rect.Height += cell.OwningRow.Height;
    }
    // 描画矩形のY座標を、結合行の最上端セルの座標にあわせる
    if(i < (rowIndex % mergeRows))
      rect.Y -= cell.OwningRow.Height;
  }
  // マージしていることになっている他のセルも
  // 書き直す必要があるためDataGridViewのGraphicsを取得
  Graphics g = this.DataGridView.CreateGraphics();
  // Graphics オブジェクト、描画矩形を設定して描画する。
  base.Paint(g, rect, rect, rowIndex, cellState, topValue,
  topFormattedValue, errorText, cellStyle,
  advancedBorderStyle, paintParts);
}

こんな感じになります。





それっぽくなりましたが、幾つか問題があります。実際に動かしてテストしてみれば、すぐに見つけることが出来ます。徐々に修正していきたいと思います。
ここまでは、大雑把感じで書けてきましたが、ここから結構細かいところに気をつけていかなければならないような気がします。とりあえず行ける所まで行きたいと思います。

0 件のコメント:

コメントを投稿