Benutzerdefiniertes Steuerelement mit SelectAll

27/05/2008 - 16:01 von Ste | Report spam
Hallo Leute!

Versuche ein eigenes Textbox Steuerelement zu generieren, welches in
zukünftigen Projekten verwendet wird. Eine Funktion soll sein, dass
beim gotFocus bzw. beim Click!! der gesamte Text markiert wird. So
weit so gut - das Problem stellt ja eigentlich nur das Click-Event
dar. Dieses Problem versuchte ich mit einer Eigenschaft (hasfocus) zu
umgehen:

Protected m_hasfocus As Boolean = False
...
Private Sub TextSelectAll(ByVal sender As System.Object, ByVal e
As System.EventArgs) _
Handles MyBase.Enter, MyBase.Click
If Me.hasfocus = True Then
Return
End If
MyBase.Focus()
MyBase.SelectAll()
Me.hasfocus = True

End Sub

Private Sub TextLostFocus(ByVal sender As System.Object, ByVal e
As System.EventArgs) _
Handles MyBase.Leave
Me.hasfocus = False
End Sub

Private Property hasfocus() As Boolean
Get
Return m_hasfocus
End Get
Set(ByVal value As Boolean)
m_hasfocus = value
End Set
End Property

Dies funktioniert so leider nicht! Keine Ahnung warum.
Wenn ich Me.hasfocus = True weg lasse, funktioniert die ganze
Geschichte, aber der gesamte Text wird bei jedem click in das Element
markiert. Ist das ein Bug in dotnet?

Bitte um Eure Meinung.

Grüße
Stephan
 

Lesen sie die antworten

#1 Elmar Boye
28/05/2008 - 11:22 | Warnen spam
Hallo Stephan,

Ste schrieb:

ein vollstàndiger Name im Absender wird hier gern gesehen. Danke.

Versuche ein eigenes Textbox Steuerelement zu generieren, welches in
zukünftigen Projekten verwendet wird. Eine Funktion soll sein, dass
beim gotFocus bzw. beim Click!! der gesamte Text markiert wird.



Da solltest Du noch ein wenig drüber nachdenken.

Mit einem einfachen Klick positioniert man üblicherweise innerhalb
des Textes. Für das Markieren des gesamten Inhalts verwendet man
normalerweise ein DoubleClick, wobei das TextBox (Edit) Steuerelement
wortweise makriert - was meist durch zusàtzliche Tasten (wie Umschalt, Strg)
erweitert wird (auf gesamt-, satzweise etc).

Zudem wird das Focus Ereignis auch ausgelöst, wenn der Benutzer
zwischen unterschiedlichen Formularen/Anwendungen wechselt:
<URL:http://msdn.microsoft.com/de-de/lib...s.aspx>

Schon das Basis Textbox Steuerelement markiert den vollstàndigen Text,
wenn das OnGotFocus erstmalig Ereignis eintritt. "Erstmalig" heißt
dabei, die Text Eigenschaft wurde gesetzt und keine Selektion
vorgenommen. Was sinnvoll ist, denn ansonsten muß der Benutzer
bei einem Wechsel des Steuerelement womöglich neu positionieren
oder Du verbaust Dir eine gezielte Selektion durch das Programm.

Dieses Problem versuchte ich mit einer Eigenschaft (hasfocus) zu
umgehen:



Ob ein Steuerelement den Fokus hat, kannst Du über die "Control.Focused"
Eigenschaft ermitteln.


Protected m_hasfocus As Boolean = False
...
Private Sub TextSelectAll(ByVal sender As System.Object, ByVal e
As System.EventArgs) _
Handles MyBase.Enter, MyBase.Click



Für abgeleitete Steuerelemente ist es sinnvoller, die geschützten
Methoden wie OnEnter, On[Mouse]Click zu verwenden. Die werden bei
Ereignissen aufgerufen, ohne einen Ereignis Delegaten zu bemühen.

Zudem empfiehlt sich mit MouseDoubleClick zu arbeiten, da Click mehr
als generisches Ereignis gedacht ist:
<URL:http://msdn.microsoft.com/de-de/lib...k.aspx>

If Me.hasfocus = True Then
Return
End If
MyBase.Focus()



FoCus wàre an dieser Stelle nicht aufzurufen, das kommt schon über die
Standardbehandlung zustande (siehe obige GotFocus Beschreibung).

Ist das ein Bug in dotnet?



Definitiv kein Bug. Nur ist das mit den Steuerelement-Ereignissen
nicht immer so gradlinig wie gewünscht. So sollte man sich zunàchst
mit der Standard-Funktionalitàt vertraut machen, die das zugrunde-
liegende Edit Control aus Windows hat:
<URL:http://msdn.microsoft.com/en-us/library/bb775458(VS.85).aspx>
denn TextBox kapselt das und fügt einiges hinzu.

Gruß Elmar

Ähnliche fragen