C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DataGridViewの行選択時における反転表示の調整


(過去ログ 16 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■6075 / inTopicNo.1)  DataGridViewの行選択時における反転表示の調整
  
□投稿者/ まんぼう (12回)-(2007/07/31(Tue) 16:00:39)

分類:[VB.NET/VB2005] 

VB2005, WinFormsです。

当初、ListView の Details を使ってデータセットのデータを表示しようとしていたのですが、
データバインド非対応なので手間が掛かりそうだと判断し、DataGridView を使用することにしました。

しかし、Windows ユーザなら見た目はエクスプローラで見慣れた ListView の方がアプリに対する違和感が少なくなるかなと思いまして、
DataGridView の外観を調整して ListView の Details っぽく見せようとしています。

そこで以下のように DataGridView のプロパティを設定しました。

        Dim col1 As New System.Windows.Forms.DataGridViewTextBoxColumn
        Dim col2 As New System.Windows.Forms.DataGridViewTextBoxColumn
        col1.HeaderText = "col1"
        col2.HeaderText = "col2"
        Me.DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {col1, col2})

        '↓このように設定
        DataGridView1.BackgroundColor = Color.White
        DataGridView1.GridColor = Color.White
        DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

これで一応 ListView っぽく見えるのですが、行選択したときに列の境界の縦線が白く見えます。
これを無くすにはどのようにすればよいのでしょうか?

引用返信 編集キー/
■6077 / inTopicNo.2)  Re[1]: DataGridViewの行選択時における反転表示の調整
□投稿者/ ぽぴ王子 (246回)-(2007/07/31(Tue) 16:16:47)
ぽぴ王子 さんの Web サイト
No6075 (まんぼう さん) に返信

んー、個人的な意見ではありますが。

> 当初、ListView の Details を使ってデータセットのデータを表示しようとしていたのですが、
> データバインド非対応なので手間が掛かりそうだと判断し、DataGridView を使用することにしました。

そもそも、この考えから改めた方がよくないですか?
確かに ListView にデータを設定するのは簡単にはいかないかもしれませんが、だからと言って
DataGridView をそれらしく見せるというのは、そもそも本末転倒です。

> しかし、Windows ユーザなら見た目はエクスプローラで見慣れた ListView の方がアプリに対する違和感が少なくなるかなと思いまして、
> DataGridView の外観を調整して ListView の Details っぽく見せようとしています。

こういった努力をしても、Windows のテーマを変更したり、OS を変更したりしたら(例えば XP → Vista とか)
全く違う見え方になりかねません。
ListView がなぜ ListView というコンポーネントとして用意されているかを考えてみるべきでしょう。
引用返信 編集キー/
■6083 / inTopicNo.3)  Re[2]: DataGridViewの行選択時における反転表示の調整
□投稿者/ まんぼう (13回)-(2007/07/31(Tue) 18:14:24)
No6077 (ぽぴ王子 さん) に返信
 
> こういった努力をしても、Windows のテーマを変更したり、OS を変更したりしたら(例えば XP → Vista とか)
> 全く違う見え方になりかねません。
> ListView がなぜ ListView というコンポーネントとして用意されているかを考えてみるべきでしょう。

確かにListViewの概観にしたいのが目的なら、ListViewを使うのが一番のような気がしてきました…。
この返信を読む前に自己解決しましたので一応コードを載せておきますが、
ListViewを習熟して何とか少ない工数で製造できるようになりたいと思います。
アドバイスありがとうございました!

---
GridColorを白くしてグリッド線を消すのではなく、OwnerDrawでグリッド線を描画しないようにしました。
CellPaintingを以下のように、です。

        Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor)
        Dim foreColorBrush As New SolidBrush(e.CellStyle.ForeColor)

        If e.RowIndex >= 0 Then

            If (e.State And DataGridViewElementStates.Selected) = DataGridViewElementStates.Selected Then
                foreColorBrush = New SolidBrush(e.CellStyle.SelectionForeColor)
                backColorBrush = New SolidBrush(e.CellStyle.SelectionBackColor)
            Else
                foreColorBrush = New SolidBrush(e.CellStyle.ForeColor)
                backColorBrush = New SolidBrush(e.CellStyle.BackColor)
            End If

            e.Graphics.FillRectangle(backColorBrush, e.CellBounds)

            If (e.Value IsNot Nothing) Then
                e.Graphics.DrawString(CStr(e.Value), e.CellStyle.Font, foreColorBrush, e.CellBounds.X + 2, e.CellBounds.Y + 2, StringFormat.GenericDefault)
            End If

            e.Handled = True

        End If

解決済み
引用返信 編集キー/
■6084 / inTopicNo.4)  Re[3]: DataGridViewの行選択時における反転表示の調整
□投稿者/ まんぼう (14回)-(2007/07/31(Tue) 18:17:48)
> 確かにListViewの概観にしたいのが目的なら、ListViewを使うのが一番のような気がしてきました…。
概観→外観(^^;;
引用返信 編集キー/
■6085 / inTopicNo.5)  Re[3]: DataGridViewの行選択時における反転表示の調整
□投稿者/ まんぼう (15回)-(2007/07/31(Tue) 18:22:33)
>         Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor)
>         Dim foreColorBrush As New SolidBrush(e.CellStyle.ForeColor)
            ↓
        Dim backColorBrush As SolidBrush
        Dim foreColorBrush As SolidBrush

あぁもぅ見直せよ自分…

引用返信 編集キー/
■6093 / inTopicNo.6)  Re[3]: DataGridViewの行選択時における反転表示の調整
□投稿者/ 魔界の仮面弁士 (366回)-(2007/07/31(Tue) 21:21:31)
各 Brush の Dispose (または Using ステートメント) が抜けているような。
引用返信 編集キー/
■6101 / inTopicNo.7)  Re[4]: DataGridViewの行選択時における反転表示の調整
□投稿者/ まんぼう (16回)-(2007/08/01(Wed) 08:53:07)
2007/08/01(Wed) 08:55:00 編集(投稿者)
No6093 (魔界の仮面弁士 さん) に返信
> 各 Brush の Dispose (または Using ステートメント) が抜けているような。

            e.Handled = True
の下に
            backColorBrush.Dispose()
            foreColorBrush.Dispose()
が抜けてました。

実は…抜けていたというよりDisposeが必要なこと自体が分かっていませんでした(-_-;
コンパイルも通るし、実行時エラーも出ないし、動作テストも通っていて、テスト方法が分からないです。多分今まで作ったプログラムも…(激汗)
なんとなくこれはまずいなというのは分かってはいるのですが…

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -