DataGridViewの特定のセルで選択状態を保ちたい VB2005

このQ&Aのポイント
  • VB2005で、DataGridViewの特定のセルでカーソルがとどまる(選択状態)ようにしたい。
  • DataGridViewの初期設定の問題でしょうか?アドバイスいただけたら幸いです。
  • DataGridView_CellEndEditイベントやDataGridView1_CellValueChangedなどでカーソルがとどまる処理をしているつもりなのですが、下の行に移動してしまいます。
回答を見る
  • ベストアンサー

DataGridViewの特定のセルで選択状態を保ちたい VB2005

DataGridViewの件で質問したいのですが。 よろしくお願いします。 VB2005で、DataGridViewの特定のセルでカーソルがとどまる(選択状態)ようにしたいのですが 思ったように動いてくれません。例えば、下のようなDataGtridViewがあったとして, 例 ------------------ |ID | X | Y | ------------------ |001| 100 | | ------------------ |002| 150 | | ------------------ |003| 105 | | ------------------ ID が002の行で、Y列のセルにカーソルが入りXと違う数を入力したら、メッセージを 表示させて、そのセルにカーソルがとどまる処理を作りたいのですが。下の行のセルに 移動してしまいます。  DataGridView_CellEndEditイベントやDataGridView1_CellValueChangedなどで カーソルがとどまる処理をしているつもりなのです下の行に移動してしまいます。 DataGridViewの初期設定の問題でしょうか? Private Sub DataGridView1_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged Dim DgvRow As Integer '行をセット DgvRow = e.RowIndex ' X と Yが異なれば、メッセージ表示 If DataGridView1("X", e.RowIndex).Value <> DataGridView1("Y", e.RowIndex).Value Then MsgBox("X <> Y", MsgBoxStyle.OkOnly) Me.DataGridView1.CurrentCell = Me.DataGridView1("Y", DgvRow) ' これも駄目だった ↓ 'Me.DataGridView1.CurrentCell = Me.DataGridView1("Y", e.RowIndex - 1) End If End Sub アドバイスいただけたら幸いです。よろしくお願い致します。 開発環境 VB2005 Visual Studio 2005 Standard Edition(SP1) Windows XP Pro SP2

質問者が選んだベストアンサー

  • ベストアンサー
  • NYOI
  • ベストアンサー率58% (56/96)
回答No.1

CellValidatingイベントハンドラで処理するといいと思います。 If e.ColumnIndex <> DataGridView1.Columns("Y").Index Then Exit Sub If DataGridView1("X", e.RowIndex).Value IsNot Nothing AndAlso _ DataGridView1.EditingControl IsNot Nothing Then If Not DataGridView1("X", e.RowIndex).Value.ToString.Equals(DataGridView1.EditingControl.Text) Then MsgBox("X <> Y", MsgBoxStyle.OkOnly) e.Cancel = True End If End If

ktksystem
質問者

お礼

この辺のDataGridViewのセルの処理は複雑みたいですね。 ありがとうございます。参考になりました。

関連するQ&A

  • VB2005 DataGridView で選択状態(青色反転)

    DataGridViewの件で質問したいのですが。 よろしくお願いします。 VB2005で、DataGridViewの特定のセルが選択されて値が青色反転した Selectイベントのような状態にしたいのですが。 例えば、下のようなDataGtridViewがあったとして, 例 ------------------ |ID | X | Y | ------------------ |001| 100 | | ------------------ |002| 150 | | ------------------ |003| 105 | | ------------------ ID が002の行で、Y列のセルにカーソルが入りXと違う数を入力したら、メッセージを 表示させて、そのセルを青色反転させる処理を作りたいのですが。下の行のセルに 移動してしまいます。 そこで下記のようなコードを書きました。 Private Sub DataTable1DataGridView_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataTable1DataGridView.CellValidating If e.ColumnIndex <> Me.DataTable1DataGridView.Columns("Y").Index Then Exit Sub If Me.DataTable1DataGridView("X", e.RowIndex).Value IsNot Nothing AndAlso _ Me.DataTable1DataGridView.EditingControl IsNot Nothing Then If Not Me.DataTable1DataGridView("X", e.RowIndex).Value.ToString.Equals(Me.DataTable1DataGridView.EditingControl.Text) Then MsgBox("X <> Y", MsgBoxStyle.OkOnly) Me.DataTable1DataGridView.BeginEdit(True) 'e.Cancel = True End If End If End Sub e.cancel = True だとセルにはとどまりますが。セルが選択状態にはなりません。 BeginEdit(True)を使うと下のセルが選択状態になります。 アドバイスいただけたら幸いです。よろしくお願い致します。 開発環境 VB2005 Visual Studio 2005 Standard Edition(SP1) Windows XP Pro SP2

  • DataGridViewで1行全てを選択状態にするには

    VB.NETのDataGridViewについての質問です。 DataGridViewでセルを選択した時に、そのセルの行を全て選択したいのですが、その方法がわからず困っています。 単純な方法を試してみたのですが Private Sub DataGridView_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellClick DataGridView.CurrentCell = DataGridView.Rows(e.RowIndex).Cells(-1) End Sub この方法ですと、Cells(-1)の所で境界外となって上手くいかないようです。 何か良い方法がありましたら、ご教授願います

  • DataGridViewで…

    初めまして、VB2005初心者のココと申します。 今、VB2005を使い開発しているのですが、詰まってしまいました。 初心者の為、くだらない内容かも知れませんが、ご教授よろしくお願いいたします。 セルに入力されたコードを元にDBから名称を抽出し、名称欄(セル)に表示するプログラムを作っています。 コードを入力し、セルからフォーカスが無くなった際に自動的に名称を表示させたいのですが、うまく表示されず、 現在は、別のセルから戻った後、フォーカスが移動されると表示されるような感じになってしまっています。 フォーカスが離れた際に、表示させればいいと思うのですが、どのようにすればいいのかよく分からず困っております。 今は、CellLeaveを使用しています。 Private Sub DataGridView1_CellLeave(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles DataGridView1.CellLeave 後、名称取得の際はこんな感じにしています。 名称取得(Val(DataGridView1(1, DataGridView1.CurrentCell.RowIndex).Value)) ※1がコードを入力する列になります。 よろしくお願いいたします。

  • DataGridViewのセルをenterキーで横移動したいです。

    VB.NET2005にてDataGridviewのセルを横移動させたいんです。 いろんな物を参考に以下のプログラムを何とかプログラムを組んでみましたが、ビルド時セル(0,0)→セル(0,1)→セル(0,2)→セル(0,3)・・・と1行目がenterキーで移動できず、2行目へ下がってしまいます。2行目からは横移動できるようになりました。 1週間近く試行錯誤しましたが、うまく動きません。 訂正箇所を教えていただけないでしょうか? よろしくお願いします。 いまの行と列の取得 Dim currentRow As Integer = Me.DataGridView1.CurrentRow.Index Dim currentColumn As Integer = Me.DataGridView1.CurrentCell.ColumnIndex Dim nextColumn As Integer = currentColumn + 1 Dim nextRow As Integer = currentRow '押したキーがENTERだったら Dim t As Object t = e.KeyCode() If t = 13 Then If nextColumn = 6 Then '列数が最終列を超えたとき nextColumn = 0 '最初の列数へ Else nextRow -= 1 End If MessageBox.Show("nextColumn =" & nextColumn & "nextRow = " & nextRow) Try Me.DataGridView1.CurrentCell = Me.DataGridView1(nextColumn, nextRow) Catch If Not (Me.DataGridView1.CurrentCell Is Nothing) Then nextColumn = 0 nextRow = 0 Me.DataGridView1.CurrentCell = Me.DataGridView1(nextColumn, nextRow) Exit Sub Else Me.DataGridView1.CurrentCell = Me.DataGridView1(nextColumn, nextRow) Exit Sub End If End Try End If

  • cellをenterで横移動

    DataGridViewのcellをEnterキーで横移動しています。Enterキーのみ続けて押している場合は、横へ動くのですが、CurrentCellの値を変更しEnterキーを押した場合、新規行のcellに値を入力しEnterキーを押した場合、横ではなく真下のcellへ移動してしまいます。 原因がわかりません。 Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown Try If (e.KeyCode = Keys.Enter) Then If (DataGridView1.CurrentCell.ColumnIndex <> DataGridView1.ColumnCount - 1) Then DataGridView1.CurrentCell = DataGridView1(DataGridView1.CurrentCell.ColumnIndex + 1, DataGridView1.CurrentCell.RowIndex) e.Handled = True ElseIf (DataGridView1.CurrentCell.RowIndex <> DataGridView1.RowCount - 1) Then DataGridView1.CurrentCell = DataGridView1(1, DataGridView1.CurrentCell.RowIndex) Else DataGridView1.CurrentCell = DataGridView1(1, 0) e.Handled = True End If End If Catch ex As Exception MessageBox.Show(ex.Message) End Try

  • DataGridViewのセル編集完了後に値を設定するには

    VB.NETのDataGridViewについて質問です。 セル編集完了後に、編集した値が不正であるならその値をセル編集前に戻すというプログラムを作成しています。 しかし、現在値を正常に戻すことが出来ずに困っています。 現在は下記のように作成しています。 (1)CellBeginEditイベントを使用して、セル編集前の段階の値を「cellItem」変数に保存する (2)CellParsingイベントを使用して、保存した値で復元する。 (2)の段階で、下記の「cellItem」変数には値が入っているにも関わらず、セルに値が登録されていません。 尚、ボタンクリックイベント等で dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = cellItem を行うと、正常に値が登録されました。 セル編集完了後に値を戻すにはどのようにすれば良いのでしょうか? お分かりになる方がいらっしゃいましたら宜しくお願いします 'セル編集開始前 Private Sub dgv_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgv.CellBeginEdit cellItem = dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value End Sub 'セル編集完了後 Private Sub dgv_CellParsing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellParsingEventArgs) Handles dgv.CellParsing dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = cellItem End Sub

  • DataGridViewの複数の指定行を取込には

    Win2003SERVER(R2)+SRLServer2000+VB.NET2008の 組合せでやっています。 VBは初心者です。 今、DataGridView1で下記の様なデーターがフォームに 表示されています。 A B C 1 11 AAA 2 22 BBB 3 33 CCC 5 55 DDD 6 66 EEE この画面でCtrlキーを押しながら Aの列の 1 3 5の列を選択しました。 その状態でBotan1を押したとき Bの列の 11 33 55 を変数 B(1) B(2) B(3) に呼込みたいのですが どうしたらいいのでしょうか 1行だけの場合、 B(1)=Me.DataGridView1(1, Me.DataGridView1.CurrentCell.RowIndex).Value をで良いと思っていますが 複数の場合はどうしたらいいのでしょうか。 ご存知の方、教えてください。

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  • VB2010DataGridView複数ページ印刷

    VB2010のDataGridViewで複数ページの印刷を試みています。 改ページに悩んでいます。「e.HasMorePages=True」で改ページは可能ですが、1ページ目も2ページ目も同じ内容が印刷されます。 1ページに30行を印刷する予定ですので、2ページ目には31行目から印刷をしたいのです。 現在、いろいろ参考にしまして、コーディングは進んでいますが、30行の指定がページ目いっぱいまで印刷される点と、2ページ目以降の印刷ができない点に悩んでいます。 書き上げたコードを記述しますので、ご存知の方が居られましたら、ご教授ください。 Dim reader As IO.StreamReader Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PrintPreviewDialog1.ShowDialog() PrintPreviewDialog1.Document = PrintDocument1 'file() ' 印刷処理を実行 'PrintDocument1.Print() 'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow) 'PrintDocumentオブジェクトの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'PrintPageイベントハンドラの追加 AddHandler pd.PrintPage, AddressOf pd_PrintPage 'PrintDialogクラスの作成 Dim pdlg As New PrintDialog 'PrintDocumentを指定 pdlg.Document = pd '印刷の選択ダイアログを表示する If pdlg.ShowDialog() = DialogResult.OK Then 'OKがクリックされた時は印刷する pd.Print() End If End Sub Dim page As Integer = 0 '現在のページ Private Const MaxLine As Integer = 30 '1ページ30行 Private Sub pd_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) page += 1 'グラフィックの定義 Dim g As Graphics = e.Graphics '総行数をallrowとする Dim allrow As Integer = DataGridView1.Rows.Count - 1 '文字列を描く 'g.DrawString(DataGridView1(0, 0).Value, _ ' New Font("MS Pゴシック", 9), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top) Dim X As Integer Dim Y As Integer Y = e.MarginBounds.Top For i As Integer = 0 To DataGridView1.Rows.Count - 1 X = e.MarginBounds.Left For j As Integer = 0 To DataGridView1.Columns.Count - 1 Dim s As String If DataGridView1(j, i).Value Is Nothing Then s = "" Else s = DataGridView1(j, i).Value End If g.DrawString(s, New Font("MS Pゴシック", 9), Brushes.Black, X, Y) 'g.DrawString(DataGridView1(j, i).Value.ToString, _ ' New Font("MS Pゴシック", 9), Brushes.Black, X, Y) X += DataGridView1.Columns(j).Width Next j Y += DataGridView1.Rows(i).Height Next i '現在のページが総ページ数より少ない場合は、次ページへ If page < (allrow \ MaxLine + 1) Then e.HasMorePages = True Else 'このページで終了 e.HasMorePages = False End If End Sub

  • VB.net 2010 DataGrigView

    VBでDataGridViewを使用して表の入力処理をして居ます。 入力内容が数字で無い時はエラー表示をして、セルのフォーカスをエラーセルに戻そうとして居ます。 実際にプログラムを組んだのですが、エラー時にセルのフォーカスが元に戻らす、エラーで無い時と同じ様に次の行に行ってしまいます。 エラー時にRow、Columnのアドレスを保存して置き、ボタンでそのRow、Columnの場所にセルのフォーカスを当てると、その位置のセルにフォーカスが当たります。 コーディング上は全く同じですが、同一処理内ではフォーカスの設定は出来ないものでしょうか。 試しに間にApplication.DoEvents()を入れてみましたが結果は同じでした。 どなたかこの現象を解決出来る方法が分かる方、若しくはDataGridViewではこの様な事は出来ない理由をご存知の方、お教え下さる様お願い致します。 ‘CellEndEdit割り込み処理 Private Sub dgvTst_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvTst.CellEndEdit Dim iVal As Integer Dim sWrk As String sWrk = dgvTst.CurrentCell.Value ‘セルの値をワークに If subChkDec(sWrk) = False Then '数字か調べる。 MsgBox("Error") ‘数字で無い時、エラー表示 iRow = dgvTst.CurrentCell.RowIndex ‘Rowアドレス取得 iCol = dgvTst.CurrentCell.ColumnIndex ‘Columnアドレス取得 lblRow.Text = iRow.ToString("D") ‘デバックの為にRow表示 lblCol.Text = iCol.ToString("D") ‘デバックの為にColumn表示 Application.DoEvents() dgvTst.CurrentCell = dgvTst.Rows(iRow).Cells(iCol) ‘RowとColumnを指定してセル位置変更したつもり、フォーカスは入力したセルの下に移動する。 End If End Sub ‘ボタンでの割り込み処理。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click dgvTst.CurrentCell = dgvTst.Rows(iRow).Cells(iCol) ‘同じ処理をボタンの割り込みで行うと指定した(エラーとなった)所にフォーカスが移る。 End Sub

専門家に質問してみよう