3

文字列「End」をテキストボックスの特定のカーソルポイントに挿入する方法を考えていますか? (「???」は以下のコードにあります)

以下のコードでわかるように、これは、ユーザーがテキスト ボックス内のキーボードで [Return] をクリックしたときに発生します。

整数 'intcurrentcolumn' として格納されているカーソル インデックスを取得するコードがあります。

ありがとう

 Private Sub Enter_Click(ByVal Sender As System.Object, ByVal k As System.Windows.Forms.KeyEventArgs)

     Dim MyTextBox As TextBox = sender
     Dim intindex As Integer
     Dim intcurrentcolumn As Integer
     Dim NewString As String

     If k.KeyCode = Keys.Return Then

        k.SuppressKeyPress = True

        intindex = MyTextBox.SelectionStart
        intcurrentColumn = intindex - MyTextBox.GetFirstCharIndexFromLine(intcurrentLine)

        If intindex = MyTextBox.Text.Length Then

         NewString = MyTextBox.Text & "<End>"

        Else: 

        ???

        End If

        MyTextBox.Text = NewString

        'Sets cursor to end of textbox
        MyTextBox.Select(MyTextBox.Text.Length, 0)

      End If

前もって感謝します !

4

2 に答える 2

4

メソッドは機能しますが、カーソル位置をリセットしますが、String.Insertこれは通常、必要なものではありません (ただし、コードは後でリセットします)。より良い代替手段は、単に設定することSelectedTextです:

MyTextBox.SelectedText = "<End>"

あなたの場合、文字列を挿入する前に、選択したテキストの長さは単に 0 です"<End>"

これにより、If…Else区別も不要になります。

Private Sub Enter_Click(ByVal Sender As Object, ByVal k As System.Windows.Forms.KeyEventArgs)
    If k.KeyCode = Keys.Return Then
        Dim MyTextBox As TextBox = DirectCast(sender, TextBox)
        MyTextBox.SelectedText = "<End>"
        MyTextBox.SelectionStart = MyTextBox.Text.Length
        k.SuppressKeyPress = True
    End If
End Sub

コードのバグも修正したことに注意してください。への代入にはsender明示的なキャストMyTextBoxが必要です! 元のコードをコンパイルした場合は、(!) set を設定する必要があります。これは、コンパイラによる型チェックの改善に不可欠であり、無条件の要件として見なされるべきです1Option Strict On

さらに、使用する前に変数を宣言しないでください。それらに最初に値を割り当てるときに、可能な限り最新の時点でそれらを宣言します。これにより、プログラムの状態を追跡しやすくなり、多くの場合、コードが短くなります。


1 (ただし、COM レイト バインディングを頻繁に使用する場合は除きます。その場合は、ファイルごとに無効にすることができます)。

于 2012-06-15T10:14:28.213 に答える
1

String.Insertメソッドを見てください。

MyTextBox.Text = MyTextBox.Text.Insert(intindex, "<End>")
于 2012-06-15T09:47:48.790 に答える