1

フォーカスを取得したときにテキスト ボックスをクリアする関数またはサブを作成したいと考えています。例えば:

textbox1内容: 「あなたの名前はここにあります。」

ユーザーがそれをクリックしたとき。「あなたの名前はここにあります。」消えるでしょう。textbox1.clearGotFocusイベントに配置することでそれを行いましたtextbox

今、私はそれにいくつかのコードを入れることを計画しています。しかし、多くのテキスト ボックスでこれを行うことを計画しているため、コーディングは反復的で長くなります。コーディングを最小限に抑えたいので、テキストボックスがフォーカスされたときにテキストボックスをクリアする関数を作成して、GotFocusイベントで関数を呼び出すだけでコーディングを削減したいと考えています。

私は今それを行う方法がわからないので、もし誰かがそうしているなら、あなたが私に与えることができるアドバイスに本当に感謝しています.

Visual Studio 2010 を使用して、Windows フォーム アプリケーション プロジェクトを作成しています。

4

3 に答える 3

5

ソリューション1

まず、VB.Net で複数のイベントをWindows フォームの単一のイベント ハンドラに接続できることを知っておいてください。

Private TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus, TextBox2.GotFocus
' Add event-handler code here.
End Sub

ソリューション2

次に、テキストボックスのテキストをクリアする汎用イベントハンドラー (元のソリューションと C# コードについて @Miky Dinescu に感謝) は、コードを削減し、いくつかのメソッドを共有するための別の可能なソリューションです。

このコードを Form.vb に入れるか、複数のフォーム間でメソッドを共有する場合は新しいクラス HelperClass に入れるだけです。

Form.vb:

Private Sub ClearTextBox(ByVal sender As Object, ByVal e As EventArgs)
  If TypeOf sender Is TextBox Then
    (DirectCast(sender, TextBox)).Text = ""
  End If
End Sub

または HelperClass.vb で:

Public Shared Sub ClearTextBox(ByVal sender As Object, ByVal e As EventArgs)
  If TypeOf sender Is TextBox Then
    (DirectCast(sender, TextBox)).Text = ""
  End If
End Sub

次に、このハンドラーをすべてのテキスト ボックスに、基本的にはフォームのコンストラクター、FormLoad イベント、またはフォームを表示する前に呼び出す "Initialize" メソッドにアタッチします。

AddHandler textbox1.GotFocus, AddressOf Me.ClearTextBox
AddHandler textbox2.GotFocus, AddressOf Me.ClearTextBox

また

AddHandler textbox1.GotFocus, AddressOf HelperClass.ClearTextBox
AddHandler textbox2.GotFocus, AddressOf HelperClass.ClearTextBox

ただし、このハンドラーをすべての TextBox にアタッチする必要があることを意味します。複数のハンドラーがある場合は、各メソッドを各 TextBox に適用する必要があります...

また、メモリ リークを防ぐためにフォームを閉じるときに AddHandler を明示的に呼び出す場合は、これらのイベント ハンドラもすべて削除する必要があります。

RemoveHandler textbox1.GotFocus, AddressOf HelperClass.ClearTextBox
RemoveHandler textbox2.GotFocus, AddressOf HelperClass.ClearTextBox

したがって、これは、いくつかのコントロール間でメソッドを共有する場合にのみお勧めします。

編集

もちろん、@DonA が示唆するように、ループを使用してここでもコードを減らすことができます。 しかし、忘れないでくださいRemoveHandler

ソリューション3

もう 1 つの解決策は、TextBox から継承する独自のカスタム TextBox クラスを作成し、このカスタム クラスを TextBox の代わりに使用するか、既にプロジェクトを作成している場合は既存の TextBox を置き換えることです。

Public Class MyTextbox
  Inherits TextBox

Protected OverridesSub OnGotFocus(ByVal e As System.EventArgs)
    MyBase.OnGotFocus(e)
    Me.Text = String.Empty
End Sub    

End Class

次に、プロジェクトをビルドします。ToolBox に MyTextbox が表示されます。それを使用するか、既存の TextBox を MyTextBox に置き換えることができます

このアプローチでは、1 つのクラスのメソッドのみを維持する必要があります。そして、ハンドラーについて心配する必要はありません...

オブジェクト指向プログラミングの優れた機能は継承です: 自分自身を奪わないでください!

最後に、 GetFocusのテキストをクリアすることが、あなたがやろうとしていることに対する良いアプローチであるかどうかはわかりません。WinForms の「Watermark TextBox」または「Cue Banner」のようです。したがって、これに興味があるかもしれません:WinFormsのテキストボックスに透かしを入れるか、Enterイベントの使用を検討して、ユーザー入力の削除を防止してください。

お役に立てれば。

于 2013-05-26T04:27:05.000 に答える
0

わかりました。私は StackOverflow.com というこのコミュニティは初めてかもしれませんが、デスクトップ プログラミングやプログラミング全般については初めてというわけではありません。同じ質問が Web フォームにも当てはまる可能性が高いからです。したがって、誰も言及していないより簡単な方法を次に示します。以下に例を示します。

Public Class LoginForm1

      Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click
        TextBox1.Text = ""

        End Sub

End Class

ご覧のとおり、EventArgs aka Event が発生すると、テキスト ボックスまたは TextBox1 をマウスでクリックすると、ボックスが自動的にクリアされます。

于 2014-02-23T03:57:20.673 に答える