掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DataGridViewのRaadOnly背景色を変えない (ID:145905)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> ''' <summary>セルがフォーカスされた時の処理です。</summary> > Private Sub DataGridView1_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter 先の私のコードでは、CellBeginEdit/CellEndEdit を利用していますが、 ここでは、CellEnter/CellLeve イベントを利用していますね。 CellEnter/CellLeve と CellBeginEdit/CellEndEdit、どちらを使うべきかは、 作成するアプリ仕様による物なので一概には言えないのですが、両者はそれぞれ、 異なる動作を行うものであるという点には注意しておいてください。 たとえば Button をひとつ用意して、その Click イベントに DataGridView1.BeginEdit(True) と記述したとします。 ボタンを押すときにはフォーカスが Button 側に移りますので、黄色セルは解除されますよね。 そしてボタンを押すと、BeginEdit により、再度編集状態に移行する事になります。 しかし CellEnter を使っていた場合、現在のセル位置は変更されていないため、 CellEnter イベントが発生せず、黄色にならない(しかし編集可能)という結果になります。 しかし、CellBeginEdit であればイベントが発生するため、再度黄色になってくれます。 > ''' <summary>セルがフォーカスされた時の処理です。</summary> > Private Sub DataGridView1_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter > ' セルの背景色を変更します。 > If e.ColumnIndex >= 0 AndAlso e.RowIndex >= 0 Then > sender.Item(e.ColumnIndex, e.RowIndex).Style = activeCellStyle > End If > End Sub イベント内で、DataGridView1 ではなく sender を使うのは、もしも今後、 DataGridView2 が登場するような場合を考えてのことです。しかしながら、 上記のように sender を Object 型のまま利用するのはやめた方が良いでしょう。 先の私のコードのように、As Object の部分を > ByVal sender As DataGridView, のように DataGridView 型に変更しておくか(要VB2008以降)、もしくは、 Dim dgv As DataGridView = DirectCast(sender, DataGridView) のように、TryCast や DirectCast 等で型変換してから使うようにします。 あるいは、元の DataGridView1 をそのまま使うか、ですね。 > Integer.TryParse(sender.Item(e.ColumnIndex, e.RowIndex).Value, no) TryParse メソッドの第一引数は Stringで、戻り値は Booleanです。なので、 If Integer.TryParse(CStr(sender.Item(e.ColumnIndex, e.RowIndex).Value), no) Then Select Case no : End Select End If のように記述した方が良いかと思います。 ただし、数値変換できない場合には no は 0 になりますので、個人番号 = 0 を使わない場合は、 Integer.TryParse(CStr(sender.Item(e.ColumnIndex, e.RowIndex).Value), no) Select Case no : End Case の記述でも良いかも知れませんね。 > Select Case no > Case 0 > sender.Item(e.ColumnIndex + 1, e.RowIndex).Value = "" > Case 1 > sender.Item(e.ColumnIndex + 1, e.RowIndex).Value = "鈴木" > Case 2 > sender.Item(e.ColumnIndex + 1, e.RowIndex).Value = "佐藤" > Case Is > 2 > sender.Item(e.ColumnIndex + 1, e.RowIndex).Value = "" > End Select これはマズイと思いますよ。たとえば、2 を入力すると "佐藤" と表示されますが、その後、 その 2 を -123 に変更したとしても、"" ではなく、"佐藤" のままになってしまいますよね。 > 1行目の値 個人番号セル = "1" と 氏名セル = "鈴木" > 2行目の値 個人番号セル = "2" と 氏名セル = "佐藤" > と入力された状態で、現在は個人番号セル("2")にキャレットがあります、 Columns(1) は ReadOnly にしていますので、氏名セルがアクティブになっても、 キャレットは表示されないはずです。フォーカス枠の破線は表示されるでしょうけれども。 (キャレット/Caretとは、TextBox 上で点滅する I の字のカーソルのことです) > その時キャレットをその行(クリックした行)の氏名セル("1")に強制的に > 置くことは可能でしょうか? 今回の場合は、SelectionMode プロパティを FullRowSelect にし、さらに MultiSelect プロパティを False にした状態で、このように記述してみてください。 Private Sub DataGridView1_SelectionChanged(ByVal sender As DataGridView, ByVal e As EventArgs) Handles DataGridView1.SelectionChanged Dim pos As Point = sender.CurrentCellAddress If pos.Y >= 0 AndAlso pos.X = 1 Then sender.CurrentCell = sender.Item(0, pos.Y) End If End Sub >> そもそも DataGridView と DataGridView.EditingControl は別物です。 > この回答の指す意味が理解できません、強制的に置くことは難しいと > 言うことなのでしょうか。 最初のコードのように、 DataGridView1.Focus() と記述しても、DataGridView.EditingControl がアクティブになるとは限らないという事です。 そもそも、DataGridView の編集を開始した時には、DataGridView の上に EditingControl(編集コントロール)が表示される仕様になっています。 現在どのコントロールがアクティブになっているかを確認するために、 フォームに Timer を貼っておき、Form の Load イベントに Timer1.Interval = 100 Timer1.Start() そして、Timer1 の Tick イベントに If Me.ActiveControl Is Nothing Then Me.Text = "" Else Me.Text = Me.ActiveControl.GetType().FullName End If と記述してみてください。 編集作業中は、DataGridView ではなく、DataGridViewTextBoxEditingControl と 表示されることが、目で確認できるかと思います。 編集コントロールの実態は、セルのタイプに応じて異なっており、 テキストボックス(DataGridViewTextBoxEditingControl)だったり、 コンボボックス(DataGridViewComboBoxEditingControl)だったりしますが、 いずれにせよ、DataGridView とは別のコントロールなのです。 ※ただし、編集コントロールが使われない場合(チェックボックスタイプのセルの時など)もあります。 フォームを表示した直後でなければ、DataGridView 自身が、編集コントロールを 自動的にアクティブにしてくれるのですが、ロード直後のタイミングだと、期待した通りに フォーカスが遷移してくれません。そこで、ActiveControl プロパティを使って、 強制的に編集コントロールをアクティブにしたというわけです。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.