none
DataGridView 内のテキスト入力で、Enter 押下で改行をさせたい。 RRS feed

  • 質問

  • Visual Studio 2005 Enterprise Edition で Visual Basic による開発を行っています。

    DataGridView を使用してのテキストデータ入力の際に、Enterキーの押下により改行コードを 入れさせることは可能でしょうか?

    基本的には

    (1)DataGridView の TextBoxColumn のセルに対するKeyDown のイベントハンドラ を作成し、

      KeyData = Enter 押下(Shift押下無)時は改行指示扱いとする。

    (2)DataGridView の EditingControlShowing イベントで、編集用の TextBox を特定し、

      編集用の TextBox の KeyDown イベントハンドラを削除後、

      (1)の KeyDown イベントハンドラを追加する。

     

    の方針で考えていますが、(1)のイベントハンドラの処理で、

    改行指示(入力テキストに改行コードを入れる)方法がわかりません。

    [Enter] キーが無理なら、[Alt]+[Enter] も可です。

    ご存知の方、よろしくお願いします。

    2010年4月22日 1:48

回答

  • 「Shift+Enter以外にEnterでも」という条件ならば

     

    Public Class InputNewLineDataGridview
     Inherits DataGridView
    
     Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean
      Const WM_KEYDOWN As Integer = &H100
      If (m.Msg = WM_KEYDOWN) _
       AndAlso m.WParam = CType(Keys.Return, IntPtr) _
       AndAlso (Control.ModifierKeys = Keys.None) _
       AndAlso Me.EditingControl IsNot Nothing _
       AndAlso Me.EditingControl.Visible _
       AndAlso TypeOf Me.EditingControl Is TextBox Then
    
       Dim txb As TextBox = CType(Me.EditingControl, TextBox)
       If (txb.WordWrap) Then
        txb.SelectedText = System.Environment.NewLine
        Return True
       End If
      End If
      Return MyBase.ProcessKeyPreview(m)
     End Function
    End Class

    #4/20 22:30 追記 Shift+Enterを無効にしたい?

    Public Class InputNewLineDataGridview
      Inherits DataGridView
    
      Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean
        Const WM_KEYDOWN As Integer = &H100
        Const WM_CHAR As Integer = &H102
    
        If Me.EditingControl IsNot Nothing _
        AndAlso Me.EditingControl.Visible _
        AndAlso TypeOf Me.EditingControl Is TextBox Then
    
          Dim txb As TextBox = CType(Me.EditingControl, TextBox)
          If (Not txb.ReadOnly) Then
            Select Case m.Msg
              Case WM_KEYDOWN
                If (CType(m.WParam, Keys) = Keys.Return _
                AndAlso Control.ModifierKeys = Keys.None) _
                AndAlso txb.WordWrap Then
                  txb.SelectedText = System.Environment.NewLine
                  Return True
                End If
              Case WM_CHAR
                If (CType(m.WParam, Keys) = Keys.Return _
                AndAlso Control.ModifierKeys = Keys.Shift) Then
                  Return True
                End If
            End Select
          End If
        End If
        Return MyBase.ProcessKeyPreview(m)
      End Function
    End Class

    2010年4月22日 10:19

すべての返信

  • vbNewLineなどを付加すればいいんじゃないでしょうか?

    (参考)
    改行、タブ文字などの定数
    http://dobon.net/vb/dotnet/string/controlchars.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年4月22日 2:27
    モデレータ
  • 特別複雑なことをしなくても、設定を1箇所変更するだけで改行の入力は出来ます。
    入力させたいTextBoxCOlumnのDefaultCellStyle.WrapModeをDataGridViewTriState.Trueにするだけです。

    入力するときにShift+Enterで改行出来ます。

    2010年4月22日 3:40
  • 特別複雑なことをしなくても、設定を1箇所変更するだけで改行の入力は出来ます。
    入力させたいTextBoxCOlumnのDefaultCellStyle.WrapModeをDataGridViewTriState.Trueにするだけです。

    入力するときにShift+Enterで改行出来ます。

    私もそれ考えたのですが、質問よく見ると、ENTER キーのみ(Shift 押下なし)、もしくは

    > [Enter] キーが無理なら、[Alt]+[Enter] も可です。

    と書いてますね。

    #まあ運用で逃げるという手もありますが・・・


    ひらぽん http://blogs.yahoo.co.jp/hilapon/
    2010年4月22日 5:39
    モデレータ
  • 「Shift+Enter以外にEnterでも」という条件ならば

     

    Public Class InputNewLineDataGridview
     Inherits DataGridView
    
     Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean
      Const WM_KEYDOWN As Integer = &H100
      If (m.Msg = WM_KEYDOWN) _
       AndAlso m.WParam = CType(Keys.Return, IntPtr) _
       AndAlso (Control.ModifierKeys = Keys.None) _
       AndAlso Me.EditingControl IsNot Nothing _
       AndAlso Me.EditingControl.Visible _
       AndAlso TypeOf Me.EditingControl Is TextBox Then
    
       Dim txb As TextBox = CType(Me.EditingControl, TextBox)
       If (txb.WordWrap) Then
        txb.SelectedText = System.Environment.NewLine
        Return True
       End If
      End If
      Return MyBase.ProcessKeyPreview(m)
     End Function
    End Class

    #4/20 22:30 追記 Shift+Enterを無効にしたい?

    Public Class InputNewLineDataGridview
      Inherits DataGridView
    
      Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean
        Const WM_KEYDOWN As Integer = &H100
        Const WM_CHAR As Integer = &H102
    
        If Me.EditingControl IsNot Nothing _
        AndAlso Me.EditingControl.Visible _
        AndAlso TypeOf Me.EditingControl Is TextBox Then
    
          Dim txb As TextBox = CType(Me.EditingControl, TextBox)
          If (Not txb.ReadOnly) Then
            Select Case m.Msg
              Case WM_KEYDOWN
                If (CType(m.WParam, Keys) = Keys.Return _
                AndAlso Control.ModifierKeys = Keys.None) _
                AndAlso txb.WordWrap Then
                  txb.SelectedText = System.Environment.NewLine
                  Return True
                End If
              Case WM_CHAR
                If (CType(m.WParam, Keys) = Keys.Return _
                AndAlso Control.ModifierKeys = Keys.Shift) Then
                  Return True
                End If
            End Select
          End If
        End If
        Return MyBase.ProcessKeyPreview(m)
      End Function
    End Class

    2010年4月22日 10:19
  • おぉ!素晴らしい!!
    VS 2008 SP1 で試してみましたが、ENTER キーでさくさく改行できますネ!!

    でも残念ながら Shift + Enter キーでも改行できてしまいます。
    試しに以下の行にブレークポイント設けても

    Dim txb As TextBox = CType(Me.EditingControl, TextBox)

    Shift + Enter キー ではブレークポイントで停止せず、改行入ってしまいます。(-ω-;

    #4/23 10:30 追記 今度はバッチリですね!大変参考になるコードです。今後の参考にさせて頂きます。


    ひらぽん http://blogs.yahoo.co.jp/hilapon/
    2010年4月22日 11:48
    モデレータ
  • trapemiyaさん、ありがとうございます。

    良い回1行ずつどこかで入力させて、それをCell内でつなぐ。。と云うのであれば、
    それぞれを改行文字でつないで表示させるだけでよいのですが、
    Cell への入力中に打たれた [Enter]キーに対して、改行処理を入れたいのです。

    説明が足りなく、申し訳ありませんでした。

    2010年4月23日 6:03
  • gekkaさん、ありがとうございました。

    まさしく知りたかった内容、ドンピシャ でした。

    早速、ソースに反映し、動作上問題ない事も確認できました。

    大変、助かりました。

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

    2010年4月23日 6:06
  • ひらぽん さん、ありがとうございました。

    なんか、私がしなければいけないアシスト(gekkaさんに対する)をして頂いたような形になり、

    大変感謝しております。

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

    2010年4月23日 6:09