Announcement

Collapse
No announcement yet.

Dynamische Variablennamen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dynamische Variablennamen?

    Hi,
    ich hab folgendes Problem:

    Ich arbeite an einem VB.Net Programm, welches Rechnungen generiert. Auf Wunsch soll das Prog auch mehrere Seiten generieren können. Dafür soll bei Klick auf "Neue Seite" einfach eine neue Seite hinzugefügt werden und die dafür benötigten Textfelder erstellt und benannt werden.

    Ich könnte alles in der Entwicklungsumgebung vorbereiten und auf Visible setzen und dann bei Klick auf Neue Seite alles anzeigen lassen, bei 80 Feldern pro Formular dauert das aber ewig und macht die .exe nur unnötig groß.
    Deshalb wollte ich eine Funktion für den "Neue Seite" Button schreiben, der die neue Seite erstellt und die dazugehörigen Textfelder.

    Das ganze sieht bis jetz so aus:


    ================================================== =======================


    Code:
    Public Function form_add(ByVal startFeld As Integer, ByVal endFeld As Integer, ByVal posY As Integer, ByVal scrollpos As Integer)
    
            Dim temp_panelvar As New Panel
            With temp_panelvar
                .Parent = Me.Panel1
                .Height = 1167
                .Width = 830
                .BackgroundImage = System.Drawing.Image.FromFile("./briefkopf_rechnung.jpg")
                .Location = New System.Drawing.Point(28, posY - scrollpos)
                .Visible = True
            End With
    
            Return temp_panelvar
    
        End Function



    ================================================== ====================


    Funktioniert soweit auch ganz gut, nur is jetz das Problem mit der Textfelderstellung.
    Der Name für ein Textfeld soll zum Beispiel lauten: art_48_bez

    Eine For-Schleife soll solche Textfelder erstellen.

    Deswegen müsste das ganze aber so aussehen:
    Dim "art_" & i & "_bez" = New TextBox

    Natürlich funktioniert das so nicht.

    Ich müsste einfach nur wissen, wie man solche dynamischen "Variablen" generieren lässt?


    Wie stelle ich das am besten an?


    Danke für euere Hilfe
    Chris

  • #2
    Ganz einfach: Innerhalb der Funktion verwendest Du die lokale Variable (wie vorgesehen). Der weist Du einfach zusätzlich mit ".Name = " den gewünschten zusammengesetzten Namen zu. (Der Designer macht ja auch nichts anderes, wie Du in der Designer.vb erkennen kannst.)

    Jürgen

    PS. Bitte nicht schlagen: ich arbeite nur mit C#, nicht mit VB. Da aber alles auf NET basiert und das VisualStudio vermutlich mit beiden Sprachen in gleicher Weise umgeht, kann ich mir nicht vorstellen, dass es anders abläuft.

    Comment


    • #3
      Hey,
      danke für die schnelle Antwort!
      Hatte vorhin wohl irgendwie nen Blackout, dass mir diese Möglichkeit nicht eingefalln is.

      Dachte irgendwie nur an die Möglichkeit

      Dim bratwurst As New TextBox
      With bratwurst
      .senf = ..
      .ketchup = ..
      End With

      Super, jetz kann ich ja endlich weitermachen! Danke dir!


      Falls es jemandem helfen sollte, poste ich einfach mal die fertige Funktion:

      Code:
          Public Function form_add(ByVal pageNumber As Integer, ByVal startFeld As Integer, ByVal endFeld As Integer, ByVal posY As Integer, ByVal scrollpos As Integer)
      
              Dim temp_panelvar As New Panel
              With temp_panelvar
                  .Parent = Me.Panel1
                  .Height = 1167
                  .Width = 830
                  .BackgroundImage = System.Drawing.Image.FromFile("./briefkopf_rechnung_2.jpg")
                  .Location = New System.Drawing.Point(28, posY - scrollpos)
                  .Visible = True
              End With
      
              Dim i As Integer
              Dim feldname
              Dim textfeldposition = 440
              For i = startFeld To endFeld
      
      
                  Dim textf_bez = New TextBox
                  With textf_bez
                      .Name = "art_" & i & "_bez"
                      .Width = 498
                      .Parent = temp_panelvar
                      .Location = New System.Drawing.Point(125, textfeldposition)
                  End With
      
                  textfeldposition = textfeldposition + 26
      
      
              Next
      
              Return temp_panelvar
      
          End Function

      Comment


      • #4
        Hey,
        jetz hab ich noch ein Problem.

        Wie kann ich dem in der Schleife generierten Textfeld nun noch einen EventHandler hinzufügen?

        Danke
        Chris

        Comment


        • #5
          Originally posted by Floatax View Post
          Wie kann ich dem in der Schleife generierten Textfeld nun noch einen EventHandler hinzufügen?
          Genauso, wie es der Designer macht.
          Originally posted by Jürgen Thomas
          Der Designer macht ja auch nichts anderes, wie Du in der Designer.vb erkennen kannst.
          Dort findest Du viele nützliche Informationen, wie man etwas macht. Unter C# sieht es so aus:
          Code:
          bratwurst.Click += MyBratwurstClicker;
          Im "Einflussbereich" Deines Codes muss es eine Methode mit dem Namen MyBratwurstClicker geben; diese Methode kann auch als Parameter von einer anderen Methode oder einer anderen Klasse übergeben werden.

          Jürgen

          Comment


          • #6
            Hab ich dich jetz richtig verstanden, dass ich eine weitere Funktion X schreiben soll, die bei .Click ausgeführt wird und diese dann praktisch so zuweise?

            Bratwurst.Click = mach_was()

            Wenn ja, dann klappt das leider nich.. Ich bekomme diesen Fehler:

            "Public Event Click(sender As Object, e As System.EventArgs)" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen.

            Ich möchte aber kein Ereignis aufrufen, sondern halt ein Ereignis "abfangen". Außerdem hab ich keine Ahnung, was ich denn nun für die beiden Argumente angebe..

            Comment


            • #7
              Hallo,

              das geht mit "AddHandler".
              Hier ein Beispiel:

              Code:
              Public Class Form1
              
                  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
              
                      Dim tb As New TextBox
                      Me.Controls.Add(tb)
                      AddHandler tb.Click, AddressOf tb_Click
              
                  End Sub
              
                  Sub tb_Click(ByVal sender As Object, ByVal e As EventArgs)
              
                      sender.text = "test"
              
                  End Sub
              
              End Class

              Comment


              • #8
                Hmm, das hab ich auch schon probiert. Bei mir sollte das dann ungefähr so aussehn:

                AddHandler textf_bez.TextChanged, AddressOf textf_bez_TextChanged

                Allerdings meckert er schon in dieser Zeile rum, dass der name "textf_bez_TextChanged" nicht deklariert sei.

                Außerdem wäre es schön, wenn er auch den zweiten Teil des Handlers automatisch generieren könnte.
                Leider hat jede TextBox in dem Form ne andere Aktion bei TextChanged auszuführen, müsste also doch für jeden der 60 TextBoxen pro Form ein eigenständiges Handler-Sub schreiben, was ich mir halt eigentlich damit ersparen wollte.

                Sorry, wenn ich mich da etwas dumm anstelle.
                Das Programm läuft soweit eigentlich super, bloß daran hänge ich halt grad.

                Comment


                • #9
                  Das er da meckert ist ja klar: Du sagst ihm ja welche Sub er beim Ereignis TextChanged aufrufen soll: textf_bez_TextChanged
                  Die musst Du aber natürlich noch schreiben (wie in meinem Beispiel).

                  Bei der dynamischen Vergabe von Prozedurnamen hinter AddressOf bin ich jetzt allerdings auch überfragt.

                  Comment


                  • #10
                    Originally posted by Philsen View Post
                    Bei der dynamischen Vergabe von Prozedurnamen hinter AddressOf bin ich jetzt allerdings auch überfragt.
                    Das kann vermutlich nicht funktionieren. AddHandler benötigt natürlich die Adresse einer speziellen Methode, und das kann nicht variabel sein.

                    Stattdessen könntest Du eine generelle Methode für alle (oder eine Reihe von) TextBoxen erstellen. Innerhalb dieses allgemeinen EventHandlers kannst Du schließlich den Sender des Ereignisses abfragen und im konkreten Fall auf eine spezielle Methode verzweigen.

                    Jürgen

                    Comment

                    Working...
                    X