Manuelle IP Eingabe Möglichkeit, aber wie?

  • VB.NET
  • .NET 4.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Manuelle IP Eingabe Möglichkeit, aber wie?

    Hallo Freunde des Programmierens.

    In meinem Programm habe ich aktuell ein paar Buttons, die bei Betätigung die eigene IP-Adresse auf eine vorgegebene feste IP umstellen.
    Nun möchte ich jedoch, das man auch eine manuelle IP und Subnet-Maske eingeben kann. Hier beginnt auch schon das Problem...

    Klar könnte ich auch einfach eine Textbox machen, in welche der Benutzer dann selbst die komplette IP wie 192.168.1.7 eingetragen kann, aber eigentlich würde ich lieber es genauso haben wollen, wie es bei Windows selbst schon ist.
    Nun hatte ich mir überlegt, dass ich 7 Textboxen hinter einander mache - 4 größere für Zahlen und 3 nicht veränderbare mit je einem Punkt.

    Ist dies der richtige Ansatz oder gibt es eine komfortablere Lösung?
    Gibt es vielleicht schon ein vergleichbares Projekt und ich hab mich mal wieder zu doof angestellt mit der Suchfunktion? ;(

    Danke
    Zauber777

    zauber777 schrieb:

    genauso haben wollen, wie es bei Windows selbst schon ist.
    Ich weiss net, wie es bei Windows selbst schon ist, aber vlt kannst du ja bei einer MaskedTextbox eine geeignete Maske einstellen, die eine einigermassen vernünftige IP-Eingabe vorgibt.
    Wird vmtl. nicht perfekt, aber ich könnt mir vorstellen, immerhin ziemlich gut.
    Hallo

    Naja bei Windows - eher in den Adaptereigenschaften unter IPv4 Settings ist es ja so das der Cursor auch immer mittig blinkt. MaskedTextbox ist hier leider nicht. Außerdem muss der Gültigkeitsbereich zwischen 0 und 255 auch berücksichtigt werden.
    Ich würde mir ein UserControl mit 4 (nicht 7) Textboxen machen zwischen welchen ein Punkt (z.b. Label) liegt.
    Dann Funktionalitäten wie

    Text mitig, Mit Pfeiltasten zwischen Textboxen hin und her, Gültigkeitbereich abfangen z.b. ist im ersten Fald 0 nicht erlaubt, alle Zeichen ausser Ziffern verbieten, automatisches springen zur nächsten Box.
    Weiters würde ich bei der eingabe von nur zwei Ziffern gefolgt von einem Punkt auch zur nächsten Textbox springen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Mein Spionageprogramm sagt: Das ist ein SysIpAddress32-control. Ist angeblich im Platform SDK enthalten. Jemand hat da auch was gebastelt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Wenn man selber keine grossen Anforderung an das IP-TextBox stellt, kann man problemlos ein MasketTextbox nehmen.
    Im Anhang liegt ein einfaches Beispiel von der "VS2008_SP1_VBSamples", das man zusammenklicken kann.

    Auf CodeProject gibt es auch Vorschläge.
    codeproject.com/Articles/9352/A-C-IP-Address-Control

    Freundliche Grüsse

    exc-jdbi
    Dateien
    Mit der MaskedTextBox habe ich nichts hinbekommen, was mir gefallen hat. Deswegen bin ich wieder bei den 4 Textboxen angekommen.
    Nun habe ich schon ewig rumprobiert und es funktioniert auch ganz gut, aber ich bekomme es einfach nicht hin, dass in den Textboxen nur Zahlen von 0 bis 255 eingetragen werden dürfen...

    Quellcode

    1. ​Option Strict On
    2. Public Class Form1
    3. Private Sub IP_Segment_TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles IP_Segment_TextBox1.KeyPress
    4. Select Case Asc(e.KeyChar)
    5. Case 48 To 57, 8, 32
    6. ' Zahlen, Backspace und Space zulassen
    7. Case Else
    8. e.Handled = True
    9. End Select
    10. If IP_Segment_TextBox1.Text.Length = 2 And e.KeyChar <> Chr(8) Then IP_Segment_TextBox2.Focus()
    11. End Sub
    12. Private Sub IP_Segment_TextBox2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles IP_Segment_TextBox2.KeyPress
    13. Select Case Asc(e.KeyChar)
    14. Case 48 To 57, 8, 32
    15. ' Zahlen, Backspace und Space zulassen
    16. Case Else
    17. e.Handled = True
    18. End Select
    19. If IP_Segment_TextBox2.Text.Length = 2 And e.KeyChar <> Chr(8) Then IP_Segment_TextBox3.Focus()
    20. End Sub
    21. Private Sub IP_Segment_TextBox3_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles IP_Segment_TextBox3.KeyPress
    22. Select Case Asc(e.KeyChar)
    23. Case 48 To 57, 8, 32
    24. ' Zahlen, Backspace und Space zulassen
    25. Case Else
    26. e.Handled = True
    27. End Select
    28. If IP_Segment_TextBox3.Text.Length = 2 And e.KeyChar <> Chr(8) Then IP_Segment_TextBox4.Focus()
    29. End Sub
    30. Private Sub IP_Segment_TextBox4_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles IP_Segment_TextBox4.KeyPress
    31. Select Case Asc(e.KeyChar)
    32. Case 48 To 57, 8, 32
    33. ' Zahlen, Backspace und Space zulassen
    34. Case Else
    35. e.Handled = True
    36. End Select
    37. If IP_Segment_TextBox4.Text.Length = 2 And e.KeyChar <> Chr(8) Then Subnetz_Segment_TextBox1.Focus()
    38. End Sub
    39. Private Sub Subnetz_Segment_TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Subnetz_Segment_TextBox1.KeyPress
    40. Select Case Asc(e.KeyChar)
    41. Case 48 To 57, 8, 32
    42. ' Zahlen, Backspace und Space zulassen
    43. Case Else
    44. e.Handled = True
    45. End Select
    46. If Subnetz_Segment_TextBox1.Text.Length = 2 And e.KeyChar <> Chr(8) Then Subnetz_Segment_TextBox2.Focus()
    47. End Sub
    48. Private Sub Subnetz_Segment_TextBox2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Subnetz_Segment_TextBox2.KeyPress
    49. Select Case Asc(e.KeyChar)
    50. Case 48 To 57, 8, 32
    51. ' Zahlen, Backspace und Space zulassen
    52. Case Else
    53. e.Handled = True
    54. End Select
    55. If Subnetz_Segment_TextBox2.Text.Length = 2 And e.KeyChar <> Chr(8) Then Subnetz_Segment_TextBox3.Focus()
    56. End Sub
    57. Private Sub Subnetz_Segment_TextBox3_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Subnetz_Segment_TextBox3.KeyPress
    58. Select Case Asc(e.KeyChar)
    59. Case 48 To 57, 8, 32
    60. ' Zahlen, Backspace und Space zulassen
    61. Case Else
    62. e.Handled = True
    63. End Select
    64. If Subnetz_Segment_TextBox3.Text.Length = 2 And e.KeyChar <> Chr(8) Then Subnetz_Segment_TextBox4.Focus()
    65. End Sub
    66. Private Sub Subnetz_Segment_TextBox4_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Subnetz_Segment_TextBox4.KeyPress
    67. Select Case Asc(e.KeyChar)
    68. Case 48 To 57, 8, 32
    69. ' Zahlen, Backspace und Space zulassen
    70. Case Else
    71. e.Handled = True
    72. End Select
    73. End Sub
    74. Private Sub Subnetz_Segment_TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Subnetz_Segment_TextBox1.KeyDown
    75. Dim value As System.Int32
    76. ' muss static sein, da Auswertung erst bei nachfolgenden Aufrufen erfolgt
    77. Static errflag As Boolean
    78. ' vollständigen inhalt der Textbox holen
    79. Dim s As String = CType(sender, Control).Text
    80. ' beim nächsten Tastendruck zunächst ev. anstehenden Fehler löschen
    81. If errflag Then
    82. Subnetz_Segment_TextBox1.Text = ""
    83. errflag = False
    84. End If
    85. ' übernahme und Auswertung mit Taste enter
    86. If e.KeyCode = Keys.Enter Then
    87. ' überprüfen, ob Inhalt rein numerisch
    88. If System.Int32.TryParse(s, value) Then
    89. ' auf Werte von 1 bis 255 begrenzen
    90. If value > 255 Then value = 255
    91. If value < 0 Then value = 0
    92. ' wieder zurückschreiben
    93. Subnetz_Segment_TextBox1.Text = value.ToString
    94. Else
    95. ' nicht numerische Zeichen im String
    96. Subnetz_Segment_TextBox1.Text = "###"
    97. errflag = True
    98. End If
    99. End If
    100. End Sub


    Der letzte Sub mit KeyDown war mein letzter Versuch, der aber leider auch überhaupt nicht reagiert.
    Wie kann ich es machen, das nach jeder Eingabe in den Textboxen die Zahl kontrolliert wird, ob diese zwischen 0 und 255 liegt?
    In Alles über Events stelle ich im 2.Snippet einen Code vor, der die Eingabemöglichkeiten auf Ziffern beschränkt.
    Mit nur minimalem Umbar könnte man die Eingaben auch auf - ach, ich mach einfach mal.

    In diese Richtextbox sollte man nix anneres als Zahlen zw 0 und 255 eingeben können:

    VB.NET-Quellcode

    1. Public Class frmEreignisDemo
    2. Private _SelStore As New SelStore
    3. Private Sub frmEreignisDemo_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    4. RichTextBox1.Text = "0"
    5. _SelStore.Store(RichTextBox1)
    6. AddHandler RichTextBox1.SelectionChanged, AddressOf RichTextBox1_SelectionChanged
    7. End Sub
    8. Private Sub RichTextBox1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs)
    9. With RichTextBox1
    10. If Byte.TryParse(.Text, 0) Then
    11. _SelStore.Store(RichTextBox1)
    12. Else
    13. RemoveHandler .SelectionChanged, AddressOf RichTextBox1_SelectionChanged
    14. _SelStore.Restore(RichTextBox1)
    15. AddHandler .SelectionChanged, AddressOf RichTextBox1_SelectionChanged
    16. End If
    17. End With
    18. End Sub
    19. End Class
    20. Public Class SelStore
    21. Private Text As String
    22. Private Start, Length As Integer
    23. Public Sub Store(ByVal tb As RichTextBox)
    24. Text = tb.Text
    25. Start = tb.SelectionStart
    26. Length = tb.SelectionLength
    27. End Sub
    28. Public Sub Restore(ByVal tb As RichTextBox)
    29. tb.Text = Text
    30. tb.Select(Start, Length)
    31. End Sub
    32. End Class
    ungetestet