Eine Methode für Mehrere Controls ?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    Eine Methode für Mehrere Controls ?

    Hallo Leute,

    ich wollte mal fragen ob es möglich ist dies zu vereinfachen..

    VB.NET-Quellcode

    1. Public DisallowedCharacters As String = "ÄÖÜäöüABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    2. 'TextBox
    3. Public Sub CheckForDisallowedCharacters(ByRef TextboxControl As TextBox)
    4. Dim theText As String = TextboxControl.Text
    5. Dim Letter As String
    6. Dim SelectionIndex As Integer = TextboxControl.SelectionStart
    7. Dim Change As Integer
    8. For x As Integer = 0 To TextboxControl.Text.Length - 1
    9. Letter = TextboxControl.Text.Substring(x, 1)
    10. If DisallowedCharacters.Contains(Letter) Then
    11. Media.SystemSounds.Beep.Play()
    12. theText = theText.Replace(Letter, String.Empty)
    13. Change = 1
    14. End If
    15. Next
    16. TextboxControl.Text = theText
    17. TextboxControl.Select(SelectionIndex - Change, 0)
    18. End Sub
    19. 'ComboBox
    20. Public Sub CheckForDisallowedCharacters(ByRef ComboBox As ComboBox)
    21. Dim theText As String = ComboBox.Text
    22. Dim Letter As String
    23. Dim SelectionIndex As Integer = ComboBox.SelectionStart
    24. Dim Change As Integer
    25. For x As Integer = 0 To ComboBox.Text.Length - 1
    26. Letter = ComboBox.Text.Substring(x, 1)
    27. If DisallowedCharacters.Contains(Letter) Then
    28. Media.SystemSounds.Beep.Play()
    29. theText = theText.Replace(Letter, String.Empty)
    30. Change = 1
    31. End If
    32. Next
    33. ComboBox.Text = theText
    34. ComboBox.Select(SelectionIndex - Change, 0)
    35. End Sub


    Die Frage die ich mir stelle ist folgende: "Kann man im Grunde hinterlegen, dass alle Controls, welche die Eigenschaft ".Text" besitzen, mit einer Methode abgedeckt werden?"
    Ohne das ich Explizit die Methode kopieren muss, für das jew. Control.

    Hoffe ihr versteht was ich meine.. :)

    Grüße,
    Drahuverar
    Option Strict On!
    Man kann auch Klassen erweitern auf die man keinen Zugriff hat, oder die Methode nicht direkt zur Klasse gehört.

    msdn.microsoft.com/de-de/library/bb384936.aspx

    Im Beispiel wird die String Klasse um die Methode Print erweitert.

    System.Reflection namespace, together with System.Type, enable you to obtain information about loaded assemblies and the types defined within them, such as classes, interfaces, and value types.">Die Klassen im System.Reflection-Namespace ermöglichen Ihnen zusammen mit System.Type, Informationen zu geladenen Assemblys und den hierin definierten Typen wie Klassen, Schnittstellen und Werttypen abzurufen. Sie können auch mithilfe von Reflektion Typeninstanzen zur Laufzeit erstellen, diese aufrufen und darauf zugreifen.


    Ich bau dir gleich mal ein Beispiel zusammen.
    Mit einer Extension kannst du bestehende Klassen um Funktionen erweitern.
    msdn.microsoft.com/en-us/library/bb384936.aspx

    Mit Reflection kannst du Klassen analysieren und zB die ganzen Eigenschaften, Attribute, Methoden, etc auszulesen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @ThuCommix
    Dafür wäre ich dir sehr Dankbar. :thumbsup:

    @fichz
    Ich lese mich mal durch den Artikel den ihr beide gepostet habt, danke :)

    Bin ich heute der einzige bei dem MSDN etwas merkwürdig aussieht? (siehe Bild)

    Grüße
    Bilder
    • MSDN Today.png

      51,64 kB, 372×780, 126 mal angesehen
    Option Strict On!
    Ich hab das ganze bloß von C# konvertiert, du müsstest also gucken ob es läuft.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public NotInheritable Class ControlExtensions
    2. Private Sub New()
    3. End Sub
    4. <System.Runtime.CompilerServices.Extension> _
    5. Public Shared Sub ValidateCharacters(ctrl As Control)
    6. Dim [property] = ctrl.[GetType]().GetProperty("Text")
    7. If [property] IsNot Nothing Then
    8. Dim text = [property].GetValue(ctrl).ToString
    9. 'hier deine Logik
    10. [property].SetValue(ctrl, text)
    11. End If
    12. End Sub
    13. End Class

    C#-Quellcode

    1. public static class ControlExtensions
    2. {
    3. public static void ValidateCharacters(this Control ctrl)
    4. {
    5. var property = ctrl.GetType().GetProperty("Text");
    6. if (property != null)
    7. {
    8. var text = property.GetValue(ctrl).ToString();
    9. //hier deine Logik
    10. property.SetValue(ctrl, text);
    11. }
    12. }
    13. }


    Drahuverar schrieb:

    Die Frage die ich mir stelle ist folgende: "Kann man im Grunde hinterlegen, dass alle Controls, welche die Eigenschaft ".Text" besitzen, mit einer Methode abgedeckt werden?"
    Das ist im Falle der Text-Property sogar besonders einfach, denn jedes Control hat eine solche.
    Geerbt nämlich.

    Sehr fragwürdig allerding, Combobox.Text ändern zu wollen.

    Und bei Textboxen, wenn gültige Eingaben von vornherein unterdrückt werden sollen, wird das auch problematisch, denn im TextChanged den Text zu changen führt zu einer Ereigniskette.
    Vielen Dank,

    das schlimme ist, dass ich sowas schon oft gesehen, aber nie hinterfragt habe.

    Habe den Code zu VB.NET angepasst:
    VB.NET Code

    VB.NET-Quellcode

    1. Public Shared Sub ValidateCharacters(ctrl As Control)
    2. Dim prop = ctrl.GetType().GetProperty("Text")
    3. If prop IsNot Nothing Then
    4. Dim text = prop.GetValue(ctrl, Nothing).ToString
    5. 'hier deine Logik
    6. prop.SetValue(ctrl, text, Nothing)
    7. End If
    8. End Sub


    SelectionStart und SelectionIndex-Problem
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Sub ValidateCharacters(ctrl As Control)
    2. Dim prop = ctrl.GetType().GetProperty("Text")
    3. If prop IsNot Nothing Then
    4. Dim text = prop.GetValue(ctrl, Nothing).ToString
    5. 'hier deine Logik
    6. Dim theText As String = ctrl.Text
    7. Dim Letter As String
    8. Dim SelectionIndex As Integer = ctrl.SelectionStart
    9. Dim Change As Integer
    10. For x As Integer = 0 To ctrl.Text.Length - 1
    11. Letter = ctrl.Text.Substring(x, 1)
    12. If DisallowedCharacters.Contains(Letter) Then
    13. Media.SystemSounds.Beep.Play()
    14. theText = theText.Replace(Letter, String.Empty)
    15. Change = 1
    16. End If
    17. Next
    18. ctrl.Text = theText
    19. ctrl.Select(SelectionIndex - Change, 0)
    20. prop.SetValue(ctrl, text, Nothing)
    21. End If
    22. End Sub


    Ich kann wohl SelectionStart nicht erben, da diese kein Member von Control ist. :huh:

    Edit:
    @ErfinderDesRades
    Habe deinen Post zu spät gesehen.
    Würde gerne gewisse Zeichen, egal bei welchem Control, unterbinden. Das kommt immer mal wieder vor.. und da ich nicht 20 Methoden wegen einer Property machen möchte, kam die Frage zustande. :saint:
    Welche Probleme siehst du unter anderem hier?
    Option Strict On!
    Also, war blöd erklärt von mir... Also alleine vom Handling der Anwendung.
    Ich habe 3 ComboBoxen, 2 werden mit einer List (Of ...) gefüllt, je nach Auswahl des Users wird die 3. ComboBox dann durch ein SQL Statement gefüllt..

    Habe nun die Eigenschaft von "DropDown" zu "DropDownList" geändert. Da kann man nun letzten Endes keine Änderungen mehr machen bzw. falsche Eingaben machen.
    Ich denke so ist es am besten..!
    Option Strict On!