Announcement

Collapse
No announcement yet.

Eilt: Datensatz Direkt aufrufen ???

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

  • Eilt: Datensatz Direkt aufrufen ???

    Halllo alle zusammen,

    stehe mal wieder vor einem Problem. Ich hoffe sehr Ihr könnt mir helfen.

    Zum Problem:

    Ich habe eine Windowsform mit einem Dataset verbunden. Nun erstellt VB2005automatisch den Bindingnavigator. Das ist auch alles super so.
    Jedoch möchte ich in dem Textfeld (Siehe Bild1), welches mit dem Dataset verbunden ist (Primärschlüsseltabelle) direkt in die Datensätze springen, wenn ich den Text ändere und mit "Enter" bestätige. Doch zurzeit wird nur das Feld geändert, welches zum Bindingnavigator vorgegebenen Datensatzes gehört. Wie kann ich diese Eigenschaft ändern???

    Mit dem Bindingnavigator habe ich zwar die Möglichkeit, von einem Datensatz zum nächsten zu springen, kann aber nicht DIREKT den Datensatz aufrufen, den ich suche, bzw der mir bekannt ist. Zum Beispiel ich habe eine Artikeldatenbank und möchte nun alle Informationen von dem Artikel mit der Nr 1000 abrufen. Dann klicke ich doch nicht 1000 mal auf den Next-Button?!?!?

    Zudem sollen bei diesem Vorgang auch alle Elemente aktualisiert werden, die sich auf der Form befinden, wenn ein entsprechender Datensatz vorhanden ist. Ansonsten springt ein Dialog auf, der fragt, ob der Datensatz neu eingefügt werden soll.

    Wenn ich den Dialog mit "Ja" bestätige und einen Datensatz neu einfüge(siehe Code), soll auch nicht - wie beim Bindingnavigator - der Datensatz an die letzte stelle Rücken, sondern er soll an die Stelle springen, in der die Zeile auch stehen wird. (Immerhin steht in diesem Falle der Primärschlüsselwert "Bedienernummer" ja zur Verfügung, der zur Neuanlage verwendet wird)


    So und nun einmal mein Code, den ich bis zu meinem Problem geschrieben habe:

    Bediener=Textbox(Siehe Bild1)


    Code:
    Private Sub BedienerTextBox_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bediener.Leave
    
            'Bediener suchen
            Dim Bediener As String = Me.Bediener.Text
            Dim aFindRow As DataRow = Me.BedienerTableAdapter.GetData.Rows.Find(Bediener)
    
            'Gesuchter Bediener nicht vorhanden
            If aFindRow Is Nothing Then
    
                'Meldung erzeugen
                Dim strMeldung As String
                strMeldung = "Der gesuchte Bediener ist nicht vorhanden? Wollen Sie Ihn jetzt anlegen?"
                Dim result As DialogResult = MessageBox.Show(strMeldung, _
                "Kein Datensatz vorhanden", _
                MessageBoxButtons.YesNo, _
                MessageBoxIcon.Question, _
                MessageBoxDefaultButton.Button2)
    
                'Result No
                If result = System.Windows.Forms.DialogResult.No Then
    
                Else
                    'Result Yes
                    result = System.Windows.Forms.DialogResult.Yes
    
                    'Passwort hashen
                    Dim nwpass As String = Me.nwpass.Text
                    Dim nhashsource As String = getMd5Hash(nwpass)
    
                    ' Neuen Datensatz erzeugen
                    Dim newBedienerRow As FMSDataSet.BedienerRow
                    newBedienerRow = Me.FMSDataSet.Bediener.NewBedienerRow()
                    newBedienerRow.Bediener = Me.Bediener.Text.ToString
                    newBedienerRow.Passwort = nhashsource.ToString
    
                    ' Datensatz anfügen
                    Me.FMSDataSet.Bediener.Rows.Add(newBedienerRow)
    
                    ' Datensatz speichern
                    Me.BedienerTableAdapter.Update(Me.FMSDataSet.Bediener)
                    MessageBox.Show("Der Bediener wurde erfolgreich angelegt", "Bediener " & Me.Bediener.Text, 0, MessageBoxIcon.Information)
    
                    'Zum Datensatz springen und alle Felder aktualisieren
                 
                    ???????Hilfe
    
                End If
            Else
                'Gesuchter Bediener vorhanden
                'Zum Datensatz springen und alle Felder aktualisieren
    
                 ???????Hilfe
    
            End If
    
    
        End Sub
    
    
    ' Press Enter auf Textfeld Bediener
    Private Sub Bediener_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Bediener.KeyPress
            If e.KeyChar = Chr(13) Then 'ENTER Klick
                SendKeys.Send("{tab}")
                e.Handled = True
            End If
        End Sub

    Ich Danke euch jetzt schon mal für eure tatkräftige Unterstützung. Bis jetzt wurde mir immer super geholfen hier.

    Gruß

    Laura
    Attached Files
    Zuletzt editiert von Siebenstein; 10.10.2007, 05:43.

  • #2
    Hallo Laura,

    War wohl doch nicht so eine ruhige Nachtruhe ;-)

    Dass der Wert des Primaerfeldes (dein Suchfeld) in der DB geaendert wird koennte meiner Meinung nach damit vermieden werden, indem du dieser Textbox einfach die BindingSource entziehst und - wie bereits in deinem Code ersichtlich - die Operationen manuell durchfuehrst.

    Zum Navigieren:
    Die BindingSource enthaelt eine Methode 'Find' welche dir den Index / Datensatznummer des gefundenen Wertes zurueck gibt, oder -1 (in C#).
    Anschliessend kannst du mit Hilfe der BindingSource Property 'Position' deinen Datensatzzeiger richtig platzieren.

    Beispiel, ist zwar in C# aber die Idee bleibt die selbe:
    ('textBox1' entspricht deinem 'Bediener' und 'ArtNr' ist mein PK Feld.)
    Code:
    private void textBox1_Leave(object sender, EventArgs e)
    {
        int index = this.testArtikelBindingSource.Find("ArtNr", (sender as TextBox).Text);
        if (index != -1)
        { this.testArtikelBindingSource.Position = index; }
     }
    HTH
    Zuletzt editiert von robert.oh.; 10.10.2007, 10:13.
    *-- robert.oh. --*

    Comment


    • #3
      Hallo Robert,

      bitte wundere Dich nicht. Ich habe Urlaub und sitze deshalb so lange vor VB.

      Mir macht das Programmieren einfach zu viel Spaß. Man kann es schon fast Leidenschaft nennen. Und bei solch netten hilfsbereiten Menschen wie in diesem Forum macht es noch mehr Spaß.


      Deine Idee habe ich mal verfolgt und entsprechend umgeschrieben.
      Ich kann meine Textbox ruhig mit der BindingSource laufen lassen.

      Habe in Deinem Code eine Zeile eingefügt:

      Code:
      Dim index As Integer = Me.BedienerBindingSource.Find("Bediener", TryCast(sender, TextBox).Text)
                  If index <> -1 Then
                      Me.Bediener.Undo()
                      Me.BedienerBindingSource.Position = index
                  End If
      Mit der Zeile "Me.Bediner.Undo()" verhindere ich die Fehlermeldung, dass beim Springen in den gesuchten Datensatz das Feld des gerade aufgerufenen Datensatzes geändert oder gar leer bleibt. (Primärschlüsselspalte/Not NULL)

      Ist das eine gute Lösung????

      Dies funktioniert allerdings nur bei bestehenden Datensätzen. Wenn ich einen neuen Datensatz einfüge (siehe Code oben) dann fügt er den Datensatz ein, bleibt aber beim 1. Datensatz stehen. Dazu kommt, dass er den neuen Datensatz ja nicht hinten einsetzten soll sondern sofort richtig platzieren soll.

      Kann ich den BindingNavigator in irgendeiner Weise neu laden, damit er die Neue Zeile in die Richtige Position bringt? Hast Du hierfür auch eine Idee??? Oder muss ich sogar das Dataset neu validieren?

      Gruß Laura

      Comment


      • #4
        Hi Urlauberin

        Das mit dem Undo() ist ein feine Sache - danke fuer den Tipp!

        Die BindingSource hat eine Property 'Sort' welcher du die Sortierung uebergeben kannst, zB: '....Sort = "PKFeld DESC"'

        Das komplette DataSet neu zu validieren waere - meiner Meinung nach zwar moeglich, aber unnoetig - kann ich mir nicht vorstellen.

        Hilft dir das weiter?
        *-- robert.oh. --*

        Comment


        • #5
          Hey Robert,

          wenn ich Dich nicht hätte. Hast mir wirklich mal wieder sher geholfen. Danke Dir sehr dafür.

          Ich habe es jetzt folgendermaßen umgesetzt:

          Bevor ich den neuen Datensatz anlege, habe ich den String (also meine Eingabe, die ich suche) in den Zwischenspeicher kopiert.

          Anschließend lege ich den Datensatz neu an. Den Code für die Position habe ich dementsprechend geändert, dass ich zum eben gespeicherten String springe, der ja nun inzwischen der Index meines neuen Datensatzes ist.

          Hier einmal der Code:


          Code:
              Private Sub BedienerTextBox_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bediener.Leave
          
                  'Bediener suchen
                  Dim Bediener As String = Me.Bediener.Text
                  Dim aFindRow As DataRow = Me.BedienerTableAdapter.GetData.Rows.Find(Bediener)
          
                  'Gesuchter Bediener nicht vorhanden
                  If aFindRow Is Nothing Then
          
                      'Meldung erzeugen
                      Dim strMeldung As String
                      strMeldung = "Der gesuchte Bediener ist nicht vorhanden? Wollen Sie Ihn jetzt anlegen?"
                      Dim result As DialogResult = MessageBox.Show(strMeldung, _
                      "Kein Datensatz vorhanden", _
                      MessageBoxButtons.YesNo, _
                      MessageBoxIcon.Question, _
                      MessageBoxDefaultButton.Button2)
          
                      'Result No
                      If result = System.Windows.Forms.DialogResult.No Then
          
                      Else
                          'Result Yes
                          result = System.Windows.Forms.DialogResult.Yes
          
                          'String in Bediener Textfeld speichern um in den Datensatz springen zu können
                          Dim Str As String = Me.Bediener.Text
                          String.Copy(Str)
                          'Passwort hashen
                          Dim nwpass As String = Me.nwpass.Text
                          Dim nhashsource As String = getMd5Hash(nwpass)
          
                          ' Neuen Datensatz erzeugen
                          Dim newBedienerRow As FMSDataSet.BedienerRow
                          newBedienerRow = Me.FMSDataSet.Bediener.NewBedienerRow()
                          newBedienerRow.Bediener = Me.Bediener.Text.ToString
                          newBedienerRow.Passwort = nhashsource.ToString
          
                          ' Datensatz anfügen
                          Me.FMSDataSet.Bediener.Rows.Add(newBedienerRow)
          
          
                          ' Datensatz speichern
                          Me.BedienerTableAdapter.Update(Me.FMSDataSet.Bediener)
                          'MessageBox.Show("Der Bediener wurde erfolgreich angelegt", "Bediener " & Me.Bediener.Text, 0, MessageBoxIcon.Information)
          
                          ' Datensätze sortieren
                          Me.BedienerBindingSource.Sort = "Bediener ASC"
          
                          'Zum Datensatz springen und alle Felder aktualisieren "Str = Eingegebener Suchbegriff"
                          Dim index As Integer = Me.BedienerBindingSource.Find("Bediener", Str)
                          If index <> -1 Then
                              Me.BedienerBindingSource.Position = index
                          End If
          
          
                          End If
                  Else
                          'Gesuchter Bediener vorhanden
                          'Zum Datensatz springen und alle Felder aktualisieren
          
                          Dim index As Integer = Me.BedienerBindingSource.Find("Bediener", TryCast(sender, TextBox).Text)
                          If index <> -1 Then
                              Me.Bediener.Undo()
                              Me.BedienerBindingSource.Position = index
                          End If
          
          
                  End If
          
          
              End Sub

          Danke für die SUPER Hilfe.

          Liebe Grüße

          Laura

          Comment


          • #6
            Feine Sache!

            Na dann steht einem gemuetlichen Urlaubs-Abend mit VB ja nix mehr im Wege
            *-- robert.oh. --*

            Comment

            Working...
            X