掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DataGridViewで行のラインの色を変えるには? (ID:145657)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 簡単なアプリを作って試してみても再現しますか? 既に最低限のコードになっているように思えますけれども…。 ぽこさんの環境では再現しなかった、という事でしょうか? > Dim startY As Integer = e.RowBounds.Top + e.RowBounds.Height - 22 この startY は、何の座標を意味する値ですか? 現在は、「上座標 + 行の高さ - 22」になっていますが、そもそも 「.Top + .Height」は「.Bottom」と同義ですので、これは「下座標 - 22」です。 この場合、それぞれの行の高さによっては、列ヘッダ内部の Y 座標に対して 描画される結果となる可能性もありますが、それで良いのでしょうか? また、そもそも「22」とは、何を意味する値なのでしょうか。 (dgv.ColumnHeadersHeight に罫線サイズを考慮した値?) > ↓でも DataGridView1_RowPostPaintで描画 > した線は消えないのですが いえ、描画されない可能性があります(理由は後述)。 > スクロールバーの↓で上にいった時は、 > 全ての線が消えてしまします。 ↓で上にいく、というのが良く分かりませんが、それは置いといて。 現在の状況は、以下のようになっています。 ================================== (1) 前提条件 ----------------- RowPrePaint と RowPostPaint の間では、その行内のセル自体の描画処理が行われます。 CellPainting の独自描画処理で e.Handled = True を行っているならばまだしも、 単体で RowPrePaint を使っても、その結果は塗りつぶされてしまう事に注意してください。 今回、RowPrePaint 単体で罫線を描画できているように見えるのには、 RowPrePaint の描画処理が、「上の行」に被せる形で行われているためです。 (このため、描画処理の順番・タイミングの影響を受ける結果になっています) そもそも RowPrePaint は、再描画が必要になった際に発生します。 「初回表示時」や「ページ単位で移動した場合」など、複数行の描画が 必要になった場合は、可視行を上から順に描画します。 上の行から順に処理されるため、上の行に被せる形で描画しても、 問題無く罫線が表示されたというわけですね。 ================================== (2) 下方向へのスクロール時の動作について ----------------- スクロールバーの[▼]の場合、先頭1行が隠れて、末尾に1行増える事になりますよね。 そのため、新たに表示される末尾行のイベントが発生することになります。 また右端/下端のセルは、セルの一部が隠れている状態であることが多いため、 通常はその直前に「前回の末尾行」のイベントも発生します。 つまり、末尾 2 行のイベントが発生します。これも上から順に発生するため、 上の行に被せる形で描画しても、線が消える事は無かったのです。 もし、DataGridView の高さが1ドット違わず、末尾行全体が完全に表示される 状態であるならば、下へのスクロールに対しても罫線は描画される事がありません。 バーのつまみを素早くドラッグして、複数行の描画に持ち込めば描画されますけれども。 ※これが、先に書いた“理由は後述”にあたります。 ================================== (3) 上方向へのスクロール時の動作について ----------------- [▲]で上に移動した場合には、先頭に1行増えて、末尾行が隠れる事になります。 そのため、新たに表示される先頭行のイベントが発生することになりますが、 今回の実装では、描画された罫線を拝む事はできません。先に書いたように、 「描画済みの上の行に対して描画した場合」にしか表示されない実装に なってしまっているためです。 ちなみに下端のセルは、先の『下スクロール』の説明にも書いたように、 セルの一部が隠されている可能性が高いわけですが、このときのクリッピングは 自動的に行われるため、『上スクロール』においては、先ほどのような 「新たな末尾行」のイベントは発生せず、先頭行のイベントのみが発生します。 ================================== > なにか消えないような設定があるのでしょうか? セル本体の描画前に罫線を書くから消えてしまうわけです。 描画後すなわち RowPostPaint を使うようにすれば解決します。 また、他の行に対して描画してしまうと意味がないので、たとえば Dim startY As Integer = e.RowBounds.Top などのように、領域内に収まるような座標を使うようにしてください。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.