Location mit String

  • VB.NET

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

    Location mit String

    Hallo Community,

    ich bin gerade auf ein Problem gestoßen und hoffe das mir einer von euch weiterhelfen kann.

    Ich möchte gerne einen Button bewegen lassen, dabei hat der Button aber immer einen anderen Namen.
    Ich habe es so versucht, aber er wirft mir den Fehler aus "Location ist kein Member von String".

    VB Code:

    VB.NET-Quellcode

    1. Dim user As String = "user_" & sSplit(0)
    2. user.Location = New Point(user_0.Location.X, user_0.Location.Y - 10)



    Mfg
    Rico
    jo, erklär mal genauer. Nur so viel: Man kann keine Location machen, auch nicht mit einem Button.
    Ein Button hat eine Location, und die kann man auch ändern - auch wenn das keine gute Idee ist.
    Einen Namen kann man nicht ändern.
    Ein Button hat zwar auch eine änderbare Name-Property, aber dabei würde gewiss nicht passieren, was du denkst.

    also erklär mal genauer.
    Gut, srry wenn das nicht so klar geworden ist ich weis nicht genau wie ich das erklären soll.

    Also ich habe mehrere Buttons die sich einzeln mit einem Code bewegen sollen.

    z.B.
    Es gibt
    Button1
    Button2
    Button3

    Button1 ist jetzt mit einem Radiobutton ausgewählt so soll er mit den Pfeiltasten sich bewegen.
    Button2 ist nun ausgewählt und soll sich mit den Pfeiltasten bewegen.

    Ich kann nicht bei der Abfrage mit "If" arbeiten also z.B.

    VB.NET-Quellcode

    1. If radiobutton1.checked = true then
    2. button1.Location = New Point(user_0.Location.X, user_0.Location.Y - 10)
    3. end if
    4. If radiobutton2.checked = true then
    5. button2.Location = New Point(user_0.Location.X, user_0.Location.Y - 10)
    6. end if

    Weil es unbestimmt viele Buttons gibt.

    Also müsste es sowas sein, das er

    VB.NET-Quellcode

    1. button_hier.Location = New Point(user_0.Location.X, user_0.Location.Y - 10)

    "button_hier" direkt ändert.
    Also du willst von mehreren Buttons einen auswählen, und dessen Location ändern. (einen Namen willst du nicht ändern).

    Und mit RadioButtons willst du einen Button auswählen?

    Also probier mal lieber erstmal mit einer Listbox - RadioButtons sind keine Auswahl-Controls für Datenverarbeitung.
    Guggemol dieses:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _Buttons As New System.ComponentModel.BindingList(Of Button)
    3. Public Sub New()
    4. InitializeComponent()
    5. For Each bt In {Button1, Button2, Button3, Button4, Button5}
    6. _Buttons.Add(bt)
    7. Next
    8. ListBox1.DataSource = _Buttons
    9. ListBox1.DisplayMember = "Name"
    10. End Sub
    11. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    12. Dim bt = _Buttons(ListBox1.SelectedIndex)
    13. bt.Enabled = Not bt.Enabled 'zeigt, welcher Button gewählt wurde.
    14. End Sub
    so, wie dus in post#1 versuchst.
    Aber mit dem Button, nicht mit einem String.

    Du lernst grade OOP, es gibt verschiedene Klassen mit je eigenen Eigenschaften. Ein String ist kein Button, deswegen kannst du mit einem Button andere Dinge machen als mit einem String.

    Es ist ganz wie im richtigen Leben, und tatsächlich ist das Ziel von Programmier-Sprachen, dem realen Leben möglichst nahe zu kommen, sodass man am Ende nur klar denken muss, dann programmiert man auch gut.
    Also im richtigen Leben zB die Klassen Fisch und Fahrad: Ein Fahrad hat keine Rückenflosse, ein Fisch keine Pedale. Beachte und nutze immer die Datentypen - nur dann kannst du radeln lernen und angeln.
    Also Entweder ich habe deine Antwort falsch verstanden oder zusehr umgesetzt.

    VB.NET-Quellcode

    1. Dim user As Button = "user_" & sSplit(0)
    2. user.Location = New Point(user_1.Location.X, user_1.Location.Y + 10)


    So sieht das jetzt aus aber er gibt trotzdem den Fehler aus ""String" kann nicht in "System.Windows.Forms.Button" konvertiert werden.".
    lies nochmal Grundlagen: Fachbegriffe , und beantworte mir einfach folgende zwei Fragen zu zeile#1:
    1. Als welchen Datentyp hast du die Variable user deklariert?
    2. Welchen Datentyp hat der Ausdruck, den du an diese Variable zuweist?

    Erzähl mir jetzt bitte nichts anderes, komm mir nicht mit anderem Code or whatever (sry - hab ich schon so oft erlebt, dass man mir die einfachsten Fragen nicht beantwortet, und aber auch nicht, dass mans nicht weiß).
    Einfach die beiden von mir nachgefragten Datentypen hinschreiben, und es bezieht sich nur auf Zeile#1.

    Danach kannst du gerne weitere Überlegungen anstellen, ob das Sinn ergibt oder nicht und warum.
    Uff, gut das man hier so abgestempelt wird...

    Aber um deine Fragen zu beantworten und kp ob´s richtig ist:
    1. Button
    2. String
    ?!?!

    Ändert nichts daran das ich etwas versuche - das anscheinend ja falsch ist - und die Lösung ja nicht weiß sonst würde ich ja nicht nachfragen?!?!

    Edit - zu deinem letzten Satz:
    Man kann ein Button nicht mit einem String ansprechen aber wie mache ich es dann?
    nein, ich will dich nicht abstempeln!

    Es kommt nur ständig vor, dass ich totales Gewäsch ohne jeden Zusammenhang mit meinen Fragen geantwortet bekomme. Und meine Frage will doch nur, dass du selber siehst, dass es offenkundig nicht funktionieren kann.
    Einer Button-Variable kannst du doch keinen String zuweisen!

    Das ist wie dein Fahrad ins Aquarium packen und die TourDeFrance auf einem Fisch zu gewinnen - es ist nichtmal ein Fehler, sondern es ergibt überhaupt gar keinen Sinn.



    Wenn du einen Button auswählen willst, dann guck in meinen Code - da wird ja ein Button ausgewählt.
    Stattfinden tut das im Listbox1_SelectionChanged-Eventhandler.
    Du musst nur die eine Zeile da mittm Enabled ändern, dass du stattdessen seine Location änderst.
    @ErfinderDesRades
    Kannst du mir evtl. noch mal helfen?

    In deinem Code

    VB.NET-Quellcode

    1. For Each bt In {Button1, Button2}
    2. _Buttons.Add(bt)
    3. Next

    müssen die Buttons die ich bewegen will, bereits auf der Form sein.
    Kann ich das irgendwie ändern, das er die Buttons die ich zusätzlich noch erstelle mit aufnimmt, so das ich diese dann auch bewegen kann?

    Gruß Rico
    Klar,

    _Buttons ist eine BindingList(Of Button) -> daher eine Gruppierung von Buttons.
    Du kannst der Gruppe jederzeit per ​.Add() einen Button hinzufügen, den du auch per Code erstellen kannst.
    Dazu brauchst du grundsätzlich nur wenige Zeilen Code. Ob das ratsam und sinnvoll ist, ist eine andere Frage. Was genau
    möchtest du eigentlich bezwecken?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Jo, nur "Gruppierung" ist das falsche Wort, es ist eine Auflistung, eine stark typisierte Auflistung, um (etwas) genauer zu sein. D.h. in _Buttons können nur Elemente des Typs Button rein.

    @Coca:
    Je nach Aufbau des Forms sähe es nun anders aus, flexibel Buttons dort einzulesen.
    Im einfachsten Falle ist sowas möglich:

    VB.NET-Quellcode

    1. For Each bt In Me.Controls.OfType(Of Button)()
    2. _Buttons.Add(bt)
    3. Next
    Me.Controls ist auch eine Auflistung, aber nicht stark typisiert. Da können alle möglichen Controls drinne sein, mit .OfType() werden die Buttons unter ihnen rausgefischt, sodass Me.Controls.OfType(Of Button)() als Ausdruck eine stark typisierte Auflistung darstellt.

    Klar soweit? ;)



    Ja, und wie Nikx bereits sagt, ist überaus fragwürdig, ob das Vorgehen sinnvoll insgesamt ist.
    Aber als Demo zum Grundverständnis von OOP ists brauchbar.



    Jetzt wirds schwierig: Korrigiere deine Projekteinstellungen in 2 Punkten
    1) stelle Option Strict on
    2) entferne den GeneralImport von Microsoft.Visualbasic
    Begründung und Anleitung (Video) findest du hier: Visual Studio - Empfohlene Einstellungen
    Du wirst nix verstehen, aber korrigiere die Einstellungen trotzdem.
    Vb.Net ist eine schöne Sprache, und ist c# vollkommen gleichwertig, aber nur, wenn man es ohne die Deppen-Einstellungen benutzt.
    Leider sind die Deppen-Einstellungen die Werks-Voreinstellung, was die Korrektur leider leider unumgänglich macht.
    Ich jedenfalls mache es mir grad zum Prinzip, Programmierer mit Deppen-Einstellungen gar nicht mehr zu unterstützen, denn jede weitere Zeile Code, die sie auf dieser Basis zufügen verfestigt ihre schlechte Gewohnheit - schadet ihnen also im Grunde.

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @EDR
    Hab etwas mit deinen QuellCode rum experimentiert und die Auflistung an einer Grid übergeben.
    Meine Frage: Warum gibts da keine Spalte "Name"
    In der Listbox wird der

    VB.NET-Quellcode

    1. (Listbox1.DisplayMember ="Name")
    auch nicht Angezeigt

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. For Each bt In {Button1, Button2, Button3, Button4, Button5}
    4. _Buttons.Add(bt)
    5. Next
    6. DataGridView1.DataSource = _Buttons
    7. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amro“ ()

    Vielen Dank euch, ich verstehe immer!!!

    So sieht jetzt mein Button Add Code aus:

    VB.NET-Quellcode

    1. Private Sub new_button(ByVal text As String, ByVal name As String)
    2. Dim myButton As New Button
    3. With myButton
    4. .Text = text.ToString
    5. .Name = name.ToString
    6. .Height = 80
    7. .Width = 100
    8. .Top = 50
    9. .Left = 50
    10. End With
    11. Me.Controls.Add(myButton)
    12. For Each bt In Me.Controls.OfType(Of Button)()
    13. _Buttons.Add(myButton)
    14. Next
    15. ListBox1.Items.Add(name.ToString)
    16. End Sub

    Funktioniert soweit, bis auf das er in _Buttons nicht den Button speichert den ich da grade erstellt habe.
    Ich denke es liegt daran das ich nicht einfach myButton einsetzen kann, weil dies nicht den Namen des Buttons enthält?
    Oder was ist falsch?
    was soll diese Schleife?

    VB.NET-Quellcode

    1. For Each bt In Me.Controls.OfType(Of Button)()
    2. _Buttons.Add(myButton)
    3. Next
    da wird myButton so oft geadded wie es Buttons auffm Form gibt.
    Wenn du myButton den _Buttons hinzufügen möchtest, dann mach das.
    Mach das genau einmal - keine Schleife.
    Und bitte guck nochmal post#7: Niemals den Listbox-Items irgendetwas adden.
    Die Listbox ist an _Buttons gebunden, bereits in Sub New - der brauchst du nix zu adden - die ist gebunden.

    ach, und was soll das?

    VB.NET-Quellcode

    1. .Text = text.ToString
    Welchen Datentyp hat text? Was bezweckst du damit, dass du dem ein .ToString anhängst?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()