DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridの行選択について

環境/言語:[WindowsXP VB.NET Framework 1.0]
分類:[.NET]

始めましてVB.NET を勉強中のpasseと申します。

初歩的な質問かもしれませんが、早速質問をさせて頂きます。

DataGrid(Windows.Forms)の行ヘッダで行を選択するときに、
1行しか選択できないようにしたのですが、やり方がわかりません。
WEBでも調べたのですが、見つけきれませんでした・・・

どうかご伝授のほどよろしくお願い致します。
こんにちわ。
DataGridのPaintイベント時に、
カレント行を選択するようにするといいと思いますよ。
↓こんな感じです。


Private Sub DataGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGrid1.Paint
DataGrid1.Select(DataGrid1.CurrentRowIndex)
End Sub
passeさん、SHさん、こんにちは。深山と申します。

■No4940に返信(passeさんの記事)
> DataGrid(Windows.Forms)の行ヘッダで行を選択するときに、
> 1行しか選択できないようにしたのですが、やり方がわかりません。
> WEBでも調べたのですが、見つけきれませんでした・・・

 割とよく見かける内容だと思うのですけど‥‥例えばこちらの掲示板でも過去同様の話題が
ありました。

http://dobon.net/vb/bbs/log3-2/618.html
http://dobon.net/vb/bbs/log3-4/1885.html


 で、管理人さまがメルマガの方に纏めてらっしゃいますので、そちらを参考にされたらいかがでしょう?

http://backno.mag2.com/reader/BackBody?id=200406010600000000104516000


■No4941に返信(SHさんの記事)
>     Private Sub DataGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGrid1.Paint
>         DataGrid1.Select(DataGrid1.CurrentRowIndex)
>     End Sub

 えっと‥‥これだと選択行が増えていってしまいません?(^_^;)
# 未検証です。勘違いでしたらごめんなさいm(__)m
> ■No4941に返信(SHさんの記事)
>> Private Sub DataGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGrid1.Paint
>> DataGrid1.Select(DataGrid1.CurrentRowIndex)
>> End Sub
>
>  えっと‥‥これだと選択行が増えていってしまいません?(^_^;)
> # 未検証です。勘違いでしたらごめんなさいm(__)m

僕も未検証です。ごめんなさいm(__)m
やってみて出来なかったら、Unselectで一回選択を解除してください。。

ただ、Current○○Changedのイベントでは、
イベントが発生しまくるので、
Paintがお勧めです。
2004/07/20(Tue) 18:52:44 編集(投稿者)

SHさん、深山さん、こんにちは。
レスありがとうございます。

■No4950に返信(SHさんの記事)
> 僕も未検証です。ごめんなさいm(__)m
> やってみて出来なかったら、Unselectで一回選択を解除してください。。
Unselectで選択を解除する行はDataGridのCurrentRowIndexより取得であっていますか?
以下のように記述したのですが、行ヘッダで複数行選択出来てしまいました。
間違いがありましたらご指摘のほどお願い致します。

-----------------------------------------------------------------------
Private Sub DataGrid_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles dgdDb.Paint
'行選択を解除する
DataGrid.UnSelect(DataGrid.CurrentRowIndex)
'行選択にする
DataGrid.Select(DataGrid.CurrentRowIndex)
End Sub
-----------------------------------------------------------------------

> ただ、Current○○Changedのイベントでは、
> イベントが発生しまくるので、
> Paintがお勧めです。
そうだったんですね!
自分は逆に Paintイベントの方が発生しまくるのかと勘違いしていました。
教えて頂きありがとうございます。

> ■No4940に返信(passeさんの記事)
>  で、管理人さまがメルマガの方に纏めてらっしゃいますので、そちらを参考にされたらいかがでしょう?
>
> http://backno.mag2.com/reader/BackBody?id=200406010600000000104516000
参考URLを教えて頂きありがとうございます!!
自分がしたい動きをしてくれました。
恥ずかしながら、オーバーライドというのを始めてしました。
といっても、管理人さまのサンプルを使用したまでなので・・・
これからオーバーライドについても勉強していかなければいけませんね(^^;
> Unselectで選択を解除する行はDataGridのCurrentRowIndexより取得であっていますか?
> 以下のように記述したのですが、行ヘッダで複数行選択出来てしまいました。
> 間違いがありましたらご指摘のほどお願い致します。
>
> -----------------------------------------------------------------------
> Private Sub DataGrid_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles dgdDb.Paint
> '行選択を解除する
> DataGrid.UnSelect(DataGrid.CurrentRowIndex)
> '行選択にする
> DataGrid.Select(DataGrid.CurrentRowIndex)
> End Sub
> -----------------------------------------------------------------------

蛇足かも知れませんが・・・
上記のやり方だと、CurrentRowIndexは同じ値なので、
今選択した行を解除→選択したことになっちゃいますよね^^;

行は、Paintの前に選択されていた行を取得しなきゃいけないので、
何かしらの変数に保持しておくか、もしくは一回全行解除しないとダメです。
(他にいい方法があるかもですが・・・)

でも、うまくいったようでなによりです。
でわ!
2004/07/20(Tue) 21:02:04 編集(投稿者)

■No4955に返信(SHさんの記事)
>>以下のように記述したのですが、行ヘッダで複数行選択出来てしまいました。
>>   -----------------------------------------------------------------------
>>    Private Sub DataGrid_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles dgdDb.Paint
>>        '行選択を解除する
>>        DataGrid.UnSelect(DataGrid.CurrentRowIndex)
>>        '行選択にする
>>        DataGrid.Select(DataGrid.CurrentRowIndex)
>>    End Sub
>>   -----------------------------------------------------------------------
> 上記のやり方だと、CurrentRowIndexは同じ値なので、
> 今選択した行を解除→選択したことになっちゃいますよね^^;

 SHさんが仰ってるように、現在行の選択を解除→選択という動作になってしまいますね(^_^;)

> 行は、Paintの前に選択されていた行を取得しなきゃいけないので、
> 何かしらの変数に保持しておくか、もしくは一回全行解除しないとダメです。

 その昔、『何かしらの変数に保持』の方法でコーディングしたことがありました。
 余り役には立たないかも知れませんけど、参考までにコードを記載致します。
# C# のものを手打ちで VB 化したので、このままではコンパイルを通らないかも‥‥

    Private lastRow As Integer = -1

    Private Sub DataGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGrid1.Paint
        If (DataGrid1.VisibleRowCount > 0) Then
            Dim currentRow As Integer = DataGrid1.CurrentCell.RowNumber
            If ((currentRow <> lastRow) AndAlso _
                ((lastRow >= 0) AndAlso (lastRow < DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember).Count))) Then
                DataGrid1.UnSelect(lastRow)
            End If
            DataGrid1.Select(currentRow)
            lastRow = currentRow
        End If
    End Sub


# ‥‥とカキコしてから気付く。昔の自分は検証してたらしい(汗)< UnSelect しなきゃいけない
SHさん、深山さん、おはようございます。
レスが遅くなりまして申し訳ございません。

> ■No4955に返信(SHさんの記事)
>>上記のやり方だと、CurrentRowIndexは同じ値なので、
>>今選択した行を解除→選択したことになっちゃいますよね^^;
変数に前の行の位置を保持しておくんですね☆
何かプロパティーがあるのかと思ってました(^^;
ありがとうございます。

■No4958に返信(深山さんの記事)
>>行は、Paintの前に選択されていた行を取得しなきゃいけないので、
>>何かしらの変数に保持しておくか、もしくは一回全行解除しないとダメです。
>
>  その昔、『何かしらの変数に保持』の方法でコーディングしたことがありました。
>  余り役には立たないかも知れませんけど、参考までにコードを記載致します。
> # C# のものを手打ちで VB 化したので、このままではコンパイルを通らないかも‥‥
>
> Private lastRow As Integer = -1
>
> Private Sub DataGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGrid1.Paint
> If (DataGrid1.VisibleRowCount > 0) Then
> Dim currentRow As Integer = DataGrid1.CurrentCell.RowNumber
> If ((currentRow <> lastRow) AndAlso _
> ((lastRow >= 0) AndAlso (lastRow < DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember).Count))) Then
> DataGrid1.UnSelect(lastRow)
> End If
> DataGrid1.Select(currentRow)
> lastRow = currentRow
> End If
> End Sub
>
>
> # ‥‥とカキコしてから気付く。昔の自分は検証してたらしい(汗)< UnSelect しなきゃいけない
サンプルPGありがとうございます。
そのままでコンパイル通りましたよ!
色々とご指導ありがとうございます。

色々と方法を教えて頂きありがとうございました!
今回はオーバーライドを勉強すると思って深山さんから紹介して頂いた
管理人さまのサンプルを参考に作成していく事にしました。
また、何かありましたら質問致しますのでその時はよろしくお願い致します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板