Adsense_top

2009年6月8日月曜日

C# DataGridView セルの結合 その4、コード変更

その4」の描画部分のコードに問題がありました。
結合セル内で、キーボードで「UP」キーを押下すると、結合セルからフォーカスが抜けていない時でも、表示が選択状態でなくなってしまいます。
上記操作をした場合新しい選択セルの描画->元のセルの描画の順にイベントが起こるためこのような感じになります。
結合セルのうグループ内で選択されたセルがある場合、選択状態(規定では青色)描画するようにしました。
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;
  bool cellSelected = false;  // <---- ★追加
  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;
    // ★以下2行追加
    // 結合されたセルのグループ内に選択されたセルがあるか確認
    if((cell.State & DataGridViewElementStates.Selected) != 0)
      cellSelected = true;
  }
  // ★以下2行追加
  // グループ内に選択されたセルがあった場合は、
  // UIの状態を選択状態にする。
  if(cellSelected)
    cellState |= DataGridViewElementStates.Selected;

  // マージしていることになっている他のセルも
  // 書き直す必要があるためDataGridViewのGraphicsを取得
  Graphics g = this.DataGridView.CreateGraphics();
  // Graphics オブジェクト、描画矩形を設定して描画する。
  base.Paint(g, rect, rect, rowIndex, cellState, topValue,
  topFormattedValue, errorText, cellStyle,
  advancedBorderStyle, paintParts);
}

次は、キーボード操作でのセル移動を考えるつもりです。その過程で、上記描画部のコードを更に変更する可能性もありますが、とりあえずここまでのコードで、辻褄が合うようにしました。

0 件のコメント:

コメントを投稿