Such Button, welcher Buttons auf Form sucht

  • VB.NET

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

    Such Button, welcher Buttons auf Form sucht

    Hallo Freunde,

    ich habe eine Form, auf welcher sehr viele Buttons sind (ca. 50).
    Die Buttons haben als Button-Name zbsp "Button1" als Text zbsp "PC-Hans 10.0.8.15".

    Im Toolstripmenu habe ich einen Button erstellt, welcher sich "Suche" nennt.
    Wenn man auf diesen klickt öffnet sich eine neue Form auf welcher eine Textbox ist und ein Button namens "suchen".
    Wenn man nun in die Textbox bsp "Hans" eingibt, dann soll er in der Hauptform zum Button "PC-Hans 10.0.8.15" springen.

    Ist dies überhaupt möglich, wenn ja wie? bisher sieht mein Code nur wie folgt aus (ich weiss recht dürftig, aber bin noch recht neu im programmieren)...

    Form1

    VB.NET-Quellcode

    1. Private Sub SuchenToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SuchenToolStripMenuItem1.Click
    2. Form2.Show()
    3. End Sub


    Form2

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. If TextBox1.Text = "*" Then
    4. End If
    5. End Sub
    6. End Class



    Ich hoffe ihr könnt mir vielleicht weiterhelfen...

    grüße
    Das hört sich so an, als ob sogar eine einfache Listbox schon ausreichen würde. Doppelklick auf ein Item fürht die Aktion aus o. ä.

    Dein Suchproblem lässt sich mit vielen einzelnen Controls auch nur sehr unbequem lösen. Mit einer Listbox ginge es so:

    VB.NET-Quellcode

    1. For i as integer = 0 to Form1.MeineListBox.Items.Count - 1
    2. If Form1.MeineListBox.Items(i).toString Like TextBox1.Text Then
    3. Form1.MeineListBox.SelectedIndex=i
    4. Exit For
    5. End If
    6. Next


    Schaue dir dazu mal den Like Operator an. Dort siehst du auch die Wildcards, wie Sternchen usw

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()

    Wie EDR sagte nicht schön... aber generell kannst Du natürlich alle deine Controls mit einer SChleife durchlaufen un schauen ob der Text von dem Control passt und dann diesem den focus geben... sicherlich nicht schön, aber machbar ...

    VB.NET-Quellcode

    1. for each crtDeinSuchDings as control in form1.controls
    2. if crtDeinSuchDings.Text = "blaaawhoateverAuchduSucheWillst" then
    3. crtDeinSuchDings.select
    4. exit for
    5. end if
    6. next crtDeinSuchDings
    ja ich muss es leider mit den buttons machen, da ich diese auf einen panel gelegt habe an bestimmte stellen, die durch das hintergrundbild im panel vorgegeben sind... ich weiss es klingt komisch, war aber anders nicht lösbar :)

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. For Each crtTextbox1 As Control In Form1.Controls
    3. If crtTextbox1.Text = TextBox1.Text Then
    4. crtTextbox1.Select() 'mit welchen Befehl sage ich dass der Button gefunden wird?
    5. Exit For
    6. End If
    7. Next crtTextbox1
    8. End Sub
    Ah sry.... bin glaub im halbschlaf...
    nenn das crt mal anders... es is ja keine Textbox ;)
    der "Befehl" steht ja in der Zeile drüber... wenn der Text von dem grade angefassten Control dem entspricht was in der Textbox(Deine Eingabe) dann wird der Button selektiert.
    Btw... wenn du von Form 2 aus suchst musste da überall noch wo es sein muss die Form1. davor schreiben
    Mache es so:

    VB.NET-Quellcode

    1. For Each c As Control In Panel1.Controls
    2. If TypeOf c Is Button Then
    3. If DirectCast(c, Button).Text Like DeinText Then
    4. c.Select() 'Oder c.Focus, weiß ich gerade nich^^
    5. End If
    6. End If
    7. Next

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    VB.NET-Quellcode

    1. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    2. Dim pntOffset As Point = New Size(8, 30)
    3. Dim strSuche As String = InputBox("Welcher Knopp")
    4. For Each crtSuche As Control In Me.Controls
    5. If crtSuche.Text = strSuche Then
    6. crtSuche.Focus()
    7. Cursor.Position = Me.Location + pntOffset + crtSuche.Location - sizeFindeMitte(crtSuche.Size)
    8. Exit For
    9. End If
    10. Next crtSuche
    11. End Sub
    12. Private Function sizeFindeMitte(ByVal sizeÜbergabe As Size) As Point
    13. Return New Size(sizeÜbergabe.Width \ 2, sizeÜbergabe.Height \ 2)
    14. End Function

    keine gute Lösung.... siehe ende Thread

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    Meine Lösung wäre es, die nicht brauchbaren Buttons auszublenden (Enabled=False).
    Denn dann sind die anderen während der Eingabe mit der Tabulator-Taste erreichbar, und mit der Leertaste auszulösen.

    Dann wäre die Lösung (fast) ein Einzeiler.

    VB.NET-Quellcode

    1. Private Sub tbSuche_TextChanged(sender As System.Object, e As System.EventArgs) Handles tbSuche.TextChanged
    2. Dim t As String = DirectCast(sender, TextBox).Text
    3. For Each element In FlowLayoutPanel1.Controls.OfType(Of Button)()
    4. element.Enabled = element.Text.ToLower.Contains(t.ToLower)
    5. Next
    6. End Sub

    Dim t As String = DirectCast(sender, TextBox).Text
    Erstellt einen String, der den Text aus der Textbox ausliest
    For Each element In FlowLayoutPanel1.Controls.OfType(Of Button)()
    Next

    In dieser Schleife wird jedes Control 'drangenommen', welches im FlowlayoutPanel vorhanden ist, und welches vom Typ Button ist.
    element.Enabled = element.Text.ToLower.Contains(t.ToLower)
    ...sollte verständlich sein. (ToLower - behandelt Kleinbuchstaben, Contains = 'enthält')

    In diesem Beispiel vorhanden:
    die Textbox, die oben behandelt wird,
    ein Flowlayoutpanel (es ginge auch jeder andere Container)
    die Buttons im Container.
    Bilder
    • PC-Hans.JPG

      43,05 kB, 527×508, 135 mal angesehen
    • PC-Hans 2.JPG

      37,49 kB, 502×497, 149 mal angesehen

    der_Kurt schrieb:

    Denn dann sind die anderen während der Eingabe mit der Tabulator-Taste erreichbar, und mit der Leertaste auszulösen.

    Das hab ich nicht ganz verstanden. Was meinst du mit auslösen?
    Den Cursor zum Button bewegen würde ich trotzdem, wenn die Form recht groß ist ist das schon für den User angenehm, oder? Spart er sich das rumeiern mit der MAus un kann ja trotzdem weiter eingeben.
    Lässt sich aber ja bestimmt da noch einbauen. Ansonsten eleganter wie meine Lösung ;)
    Auslösen: Das Click-Ereignis eines Controls kannst du auslösen, wenn du mit der Maus draufklickst, ODER wenn dein Control den Focus hat, kannst du mit der Leertaste ebenfalls dieses Ereignis auslösen. (Der Focus ist das bunte Rechteck, das wandert, wenn du die Tabulator-Taste betätigst.)

    Versuche mal, das Beispiel auszuprobieren. Erstelle ein neues Projekt. Die benötigten Controls habe ich angegeben, der gesamte Quelltext steht oben. Wenn du, wie im zweiten Bild gezeigt, "mich" tippst, werden schon die nicht zutreffenden Buttons ausgeblendet. Dann kannst du mit der Tabulator-Taste durch die übriggebliebenen Controls durch"zappen", und das richtige dann mit der Leertaste auswählen.

    Probiers einfach aus. :|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

    Genrell hatte ich schon alles verstanden...
    das BEispiel an sich habe ich ja auch... siehe mein Lösungsvorschlag. Allerdings funktioniert das mit dem auslösen nicht.. deshalb war ich irritiert ;) --> ah merke erst mit der TAB-Taste hinspringen ... 8-)
    wobei die Tab bei mir auch die noch vorhandenen Text- und Listboxen mit nimmt ;)
    da bevorzuge ich dann das einfügen von

    VB.NET-Quellcode

    1. If element.Text.ToLower.Contains(t.ToLower) Then
    2. Dim pntOffset As Point = New Size(8, 30)
    3. Cursor.Position = Me.Location + pntOffset + element.Location + sizeFindeMitte(element.Size)
    4. End If

    dem hier zusätzlich :D
    Habe nun folgendes ausprobiert von euren beiden Vorschlägen.

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    2. Dim t As String = DirectCast(sender, TextBox).Text
    3. For Each element In FlowLayoutPanel1.Controls.OfType(Of Button)()
    4. element.Enabled = element.Text.ToLower.Contains(t.ToLower)
    5. Next

    geht, aber leider springt er nicht automatisch hin, sondern nur per tab

    als Inputbox wäre es komfortabler, deswegen hatte ich folgendes versucht, aber leider ohne erfolg :(

    VB.NET-Quellcode

    1. Private Sub SuchenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SuchenToolStripMenuItem.Click
    2. Dim strBeispiel As String = InputBox("Bitte den Namen des Buttons eingeben:")
    3. Dim t As String = DirectCast(sender, InputBox).Text
    4. For Each element In Me.Controls.OfType(Of Button)()
    5. element.Enabled = element.Text.ToLower.Contains(t.ToLower)
    6. If element.Text.ToLower.Contains(t.ToLower) Then
    7. Dim pntOffset As Point = New Size(8, 30)
    8. Cursor.Position = Me.Location + pntOffset + element.Location + sizeFindeMitte(element.Size)
    9. End If
    10. Next
    11. End Sub


    die folgenden Fehler werden mir ausgegeben :

    Fehler 1 Der Typ "InputBox" ist nicht definiert.
    Fehler 2 "sizeFindeMitte" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
    Ich habe die Lösung mit der Tab-Taste (die ja nicht zwangsläufig verwendet werden muss) gewählt, weil ja bei Eingabe von "Hans" - siehe dein Eröffnungspost - eventuell mehrere Buttons gemeint sein könnten. Das habe ich in meinen beiden Screenshots angedeutet.

    Ansonsten: Suche den Button mit dem Text aus deiner Textbox/Inputbox, und aktiviere ihn. Das wäre dann ein Einzeiler.

    Ein Mischen der Codes halte ich für wenig sinnvoll. Hier sind mehrere Ansätze verwendet worden.

    BTW: Inputbox ist vorhanden im Namespace Microsoft.VisualBasic.Interaction. Schau mal, ob du alle Verweise richtig gesetzt hast.
    stimmt zu Fehler 2 ist es ein schusslichkeitsfehler von mir gewesen :)

    zu Fehler 1 verstehe ich es auch nicht. es wird die Inputbox bei "Dim t As String = DirectCast(sender, InputBox).Text" bemeckert... damit will ich ja bewirken, dass er die eingabe in der Inputbox nimmt. habe es auch mit prompt anstatt von InputBox, aber gleicher fehler.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „zauber777“ ()