none
DataGridViewで違うグリッドに移動する際に元いたグリッドの選択状態のセルを選択解除したい RRS feed

  • 質問

  • はじめまして。今現在、DataGridViewで違うグリッドに移動する際に元いたグリッドの選択状態のセルを選択解除したいとおもい試行錯誤しているところです。

     

    clearselectionで対応しようと思ったのですが、どのようなイベントにすればいいのかわかりません。

     

    lostfocusなども考えたのですが、Text_changedでフォーカスをテキストボックスに戻してしまっているので選択した瞬間にセルが選択解除になってしまいます…。

     

    何か他にいいイベントがあればお教えいただきたく書き込みをさせていただきました。

     

    ちなみにかなりの初心者なので書き方などわかりずらいところが多々あるかと思いますので、

     

    そちらもあわせてご指摘いただけると幸いです。

     

    よろしくお願いいたします。

    2008年6月23日 9:30

回答

  • >違うグリッドに移動する
    違う「行」または「列」ではなく、
    複数DataGridViewがあって、ある1つのDataGridViewから違う「DataGridViewに」移動するという意味でしょうか?
    フォーカスをなくした瞬間のイベントでは、他に「Leave」というのがありますが…。

    もし可能であれば、差し支えのない範囲で現状のコードを示してくださるとより回答がつきやすいと思います。
    2008年6月23日 10:06
  •  kenji1983 さんからの引用

    一応セルクリックでテキストボックスに文章が飛ぶようになってるのですが、上記に教えていただいた「Leave」も

     

    フォーカスがテキストチェンジイベントでテキストボックスに移ってるので、セルをクリックした瞬間に

     

    選択が解除されてしまいます。

     

    これは、次のような意味でしょうか?

    DataGridViewAとDataGridViewBがあり、DataGridViewBをクリックした際にのみDataGridViewAの選択を解除したい。ところがDataGridViewAをクリックした際にもフォーカスがTextBoxに移ってしてしまうので、DataGridViewAの選択が解除されてしまう。

    2008年6月24日 0:46
    モデレータ
  • 今、どのDataGridViewがカレントであるかを記憶しておきます。そして、DataGridViewのCellClickイベントで、その記憶されているDataGridViewのセルの選択を解除するようにすれば良いと思います。簡単には以下の感じです。

     

         Dim CurrentDataGridView As DataGridView

     

        Private Sub DataGridViewFocus_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            CurrentDataGridView = DataGridView1

        End Sub

     

        Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

            If CurrentDataGridView.Equals(sender) Then Return

     

            CurrentDataGridView.CurrentCell = Nothing
            CurrentDataGridView = DataGridView1
        End Sub

     

        Private Sub DataGridView2_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView2.CellClick

            If CurrentDataGridView.Equals(sender) Then Return

     

            CurrentDataGridView.CurrentCell = Nothing
            CurrentDataGridView = DataGridView2
        End Sub

     

        Private Sub DataGridViewFocus_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
            DataGridView2.CurrentCell = Nothing
        End Sub

    2008年6月24日 5:43
    モデレータ
  • 一つ私からの訂正です。CurrentDataGridViewという変数名を使ってしまいましたが、あまり良い名前ではありません。もうちょっと、一時記憶している変数だとわかるような名前にすれば良かったと思います。あと、camel形式の採用などです。(VBは大文字小文字を区別しませんが・・・)

     

    大文字の使用規則

    http://msdn.microsoft.com/ja-jp/library/ms229043(VS.80).aspx

     

    LoadとShownイベントはもちろんMSDNに載っています。ここでShownイベントを使っているのは、Loadイベントの段階でDataGridViewのCurrentCell をNothingにしても、それが反映されない(結果的に無視される)からです。

     

    Form.Load イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.load.aspx

     

    Form.Shown イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.shown.aspx

    2008年6月24日 6:58
    モデレータ
  • あれ? ホントですね。私の方でも動きました。この手の動作はShownイベントでないとうまく動かなかった記憶があるのですが、私の勘違いだったかもしれません。

    あっ、でも、以下の情報がありますね。

     

    DataGridViewコントロールで起動時にセルが選択されないようにするには?[2.0のみ、C#、VB]

    http://www.atmarkit.co.jp/fdotnet/dotnettips/512dgvcurrent/dgvcurrent.html

     

    はっきりわかりませんが、固いのはShownイベントで行うのがいいんじゃないかと思います。

    2008年6月24日 9:38
    モデレータ

すべての返信

  • 大変失礼いたしました。追記です。

     

    開発環境はVB2008proです。

     

    よろしくお願いいたします。

     

    2008年6月23日 9:47
  • >違うグリッドに移動する
    違う「行」または「列」ではなく、
    複数DataGridViewがあって、ある1つのDataGridViewから違う「DataGridViewに」移動するという意味でしょうか?
    フォーカスをなくした瞬間のイベントでは、他に「Leave」というのがありますが…。

    もし可能であれば、差し支えのない範囲で現状のコードを示してくださるとより回答がつきやすいと思います。
    2008年6月23日 10:06
  • ご返信ありがとうございます。

     

    はい。違う「DataGridView」に移動するという意味です。

     

    「leave」ですか。ちょっと試しにやってみます。

     

    ちなみにコードが今のPCにははいっていないので申し訳ないのですが、

     

    明日になってしまいそうです…。

    2008年6月23日 12:10
  •  

    Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVDoko.CellClick, DGVJyouken.CellClick, DGVSeason.CellClick, DGVNanishita.CellClick, DGVDonogurai.CellClick

            Dim Grid As DataGridView = CType(sender, DataGridView)
            Dim upd_rowindex As Integer = Grid.SelectedCells(0).RowIndex

            srt = Me.Txttokki.SelectionStart

            If Grid(ColName, upd_rowindex).Value() Is System.DBNull.Value Then

                Exit Sub

            Else

                Me.Txttokki.Text = Me.Txttokki.Text.Insert(srt, Grid(ColName, upd_rowindex).Value())
                Call TxtInFocus()

            End If
        End Sub


        Private Sub TxtInFocus()

            With Txttokki

                .Focus()
                .SelectionStart = .Text.Length
                .Modified = True

            End With

     

     Private Sub Txttokki_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Txttokki.TextChanged

            Me.Txttokki.Focus()

        End Sub

     

    一応セルクリックでテキストボックスに文章が飛ぶようになってるのですが、上記に教えていただいた「Leave」も

     

    フォーカスがテキストチェンジイベントでテキストボックスに移ってるので、セルをクリックした瞬間に

     

    選択が解除されてしまいます。他に丁度いいイベントなど何かご存知の方がいらっしゃるならば

     

    ご指導のほどよろしくお願いいたします。

     

    もしかしたらコード自体があまり綺麗ではないかもしれませんが…。

    2008年6月24日 0:18
  •  kenji1983 さんからの引用

    一応セルクリックでテキストボックスに文章が飛ぶようになってるのですが、上記に教えていただいた「Leave」も

     

    フォーカスがテキストチェンジイベントでテキストボックスに移ってるので、セルをクリックした瞬間に

     

    選択が解除されてしまいます。

     

    これは、次のような意味でしょうか?

    DataGridViewAとDataGridViewBがあり、DataGridViewBをクリックした際にのみDataGridViewAの選択を解除したい。ところがDataGridViewAをクリックした際にもフォーカスがTextBoxに移ってしてしまうので、DataGridViewAの選択が解除されてしまう。

    2008年6月24日 0:46
    モデレータ
  • ご返信ありがとうございます。

     

    はい、まさしくその通りです。合計5つのDataGridViewがあるのですが、

     

    その中で一つのDataGridViewの一つのセルだけを選択状態にしておきたいのです…。

     

    色々調べて試行錯誤したのですが全てが選択解除されてしまう状態です。

     

    どうすればいいのか皆目見当も付かずさまよっています…。

     

    2008年6月24日 0:52
  • イベントはとりあえずenterを使って行うことにしてみました。

     

    今度は、そこでどうやったら選択解除ができるのかが分からなくなってしまいました…。

     

    何かお分かりのかたがいらっしゃったら教えていただけますでしょうか?

     

    情報が少ないなどのご要望がありましたらお申し付け下さい。

     

    よろしくお願いいたします。

    2008年6月24日 5:23
  • 今、どのDataGridViewがカレントであるかを記憶しておきます。そして、DataGridViewのCellClickイベントで、その記憶されているDataGridViewのセルの選択を解除するようにすれば良いと思います。簡単には以下の感じです。

     

         Dim CurrentDataGridView As DataGridView

     

        Private Sub DataGridViewFocus_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            CurrentDataGridView = DataGridView1

        End Sub

     

        Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

            If CurrentDataGridView.Equals(sender) Then Return

     

            CurrentDataGridView.CurrentCell = Nothing
            CurrentDataGridView = DataGridView1
        End Sub

     

        Private Sub DataGridView2_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView2.CellClick

            If CurrentDataGridView.Equals(sender) Then Return

     

            CurrentDataGridView.CurrentCell = Nothing
            CurrentDataGridView = DataGridView2
        End Sub

     

        Private Sub DataGridViewFocus_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
            DataGridView2.CurrentCell = Nothing
        End Sub

    2008年6月24日 5:43
    モデレータ
  •  trapemiya さんからの引用

     

         Dim CurrentDataGridView As DataGridView

     

        Private Sub DataGridViewFocus_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            CurrentDataGridView = DataGridView1

        End Sub

     

        Private Sub DataGridViewFocus_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
            DataGridView2.CurrentCell = Nothing
        End Sub

     

    trapemiya様、ご回答ありがとうございます。試してみたところあっという間に思っていた通りの動きを出来ました。

     

    しかしながら、できることならば下記のようにすべてまとめてコードをすっきりさせようと思うのですが上記もまとめることは可能でしょうか?  

     

    ’先ほどのコードをまとめさせていただいたものです。

     Private Sub DataGridView_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVDoko.CellClick, DGVDonogurai.CellClick, DGVJyouken.CellClick, DGVNanishita.CellClick, DGVSeason.CellClick
            Dim Grid As DataGridView = CType(sender, DataGridView)

            If CurrentDataGridView.Equals(sender) Then Return

            CurrentDataGridView.CurrentCell = Nothing
            CurrentDataGridView = Grid
        End Sub

     

    また、テキストボックスにDataGridViewの内容を反映処理が下記となっております。

     

       Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVDoko.CellClick, DGVJyouken.CellClick, DGVSeason.CellClick, DGVNanishita.CellClick, DGVDonogurai.CellClick

            Dim Grid As DataGridView = CType(sender, DataGridView)
            Dim upd_rowindex As Integer = Grid.SelectedCells(0).RowIndex

            srt = Me.Txttokki.SelectionStart

            If Grid(ColName, upd_rowindex).Value() Is System.DBNull.Value Then

                Exit Sub

            Else

                Me.Txttokki.Text = Me.Txttokki.Text.Insert(srt, Grid(ColName, upd_rowindex).Value())
                Txttokki.SelectionStart = Txttokki.Text.Length
                Txttokki.Modified = True
            End If

        End Sub

     

    よろしくお願いいたします。

    2008年6月24日 6:15
  • 大変失礼いたしました…。

     

    今確認してみたところ全部のDataGridViewでできることがわかりました。

     

    ありがとうございます。まだまだ、ど素人なので至らない点が多々あったと思います。

     

    ありがとうございました。

     

    ただ一点ご質問があります。

     

    Focus_RoadとFocus_Shownというのがいまいちつかめていません。msdnで調べて出てきますでしょうか?

     

    自分が検索してみたところMyBaseしか出てこなかったので…

     

    よろしければご指導ご鞭撻の程よろしくお願いいたします。

     

    2008年6月24日 6:30
  • 一つ私からの訂正です。CurrentDataGridViewという変数名を使ってしまいましたが、あまり良い名前ではありません。もうちょっと、一時記憶している変数だとわかるような名前にすれば良かったと思います。あと、camel形式の採用などです。(VBは大文字小文字を区別しませんが・・・)

     

    大文字の使用規則

    http://msdn.microsoft.com/ja-jp/library/ms229043(VS.80).aspx

     

    LoadとShownイベントはもちろんMSDNに載っています。ここでShownイベントを使っているのは、Loadイベントの段階でDataGridViewのCurrentCell をNothingにしても、それが反映されない(結果的に無視される)からです。

     

    Form.Load イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.load.aspx

     

    Form.Shown イベント
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.shown.aspx

    2008年6月24日 6:58
    モデレータ
  • わかりました。確認して今一度、変数名を考えて変更してみます。

     

    大変参考になりました。まだまだ力不足だなとあらためて実感しました。

     

    お答えいただいてありがとうございました。

    2008年6月24日 7:20
  • 度々もうしわけありません。

     

    shownに記載している内容をそのままloadに記載してみても問題なく動作するのですが

     

    なぜでしょうか?

     

    よろしければお教えいただけますでしょうか。

     

    よろしくお願いいたします。

    2008年6月24日 9:26
  • あれ? ホントですね。私の方でも動きました。この手の動作はShownイベントでないとうまく動かなかった記憶があるのですが、私の勘違いだったかもしれません。

    あっ、でも、以下の情報がありますね。

     

    DataGridViewコントロールで起動時にセルが選択されないようにするには?[2.0のみ、C#、VB]

    http://www.atmarkit.co.jp/fdotnet/dotnettips/512dgvcurrent/dgvcurrent.html

     

    はっきりわかりませんが、固いのはShownイベントで行うのがいいんじゃないかと思います。

    2008年6月24日 9:38
    モデレータ
  • お早いご回答ありがとうございます。

     

    参考になるものばかりでびっくりです。

     

    もっと勉強して頑張りたいと思います。ありがとうございました。

     

    2008年6月24日 9:40
  • 確かに不確定要素があり危ないような気がします。

     

    固くshownイベントで行いたいと思います。

     

    ありがとうございました。

     

    2008年6月24日 10:15
  • こんにちは。フォーラムオペレータ大久保です。

     

    kenji1983 さん、フォーラムのご利用ありがとうございます。

    trapemiya さんのアドバイスでおやりになりたいことが実現できたようで、なによりです

    ぜひ多くの皆様にこのスレッドを役立てていただきたく、アドバイスをくださった trapemiya さん、txxxxxxx さんの回答に「回答済み」チェックをつけさせていただきました。

     

    また何かありましたら、MSDN フォーラムをご利用くださいませ。

    2008年7月3日 8:38