2016-07-10 19 views
1

Ich habe ein VB6-Projekt erstellt und ich habe eine Methode, die Schüler aus einer Access-Datenbank sucht und bearbeitet. Ich muss das Programm so programmieren, dass es den durchsuchten Schüler auswählt und modifiziert. Ich habe diese Webseite gesehen, aber sie wählt den Schüler nicht aus, der Benutzer muss ihn auswählen, bevor er Änderungen vornimmt, https://support.microsoft.com/en-us/kb/195472. Wie programmiere ich es so, dass es diese bestimmte Zeile auswählen kann, damit der Benutzer sie bearbeiten kann. -Code mit Hilfe der Website:Programmgesteuertes Auswählen von Zeilen in vb6 Datagrid

Option Explicit 
Dim connSearch As New ADODB.Connection 
Dim rec As New ADODB.Recordset 

Private Sub cmdSearch_Click() 
connSearch.Close 
connSearch.Open connstr 
rec.CursorLocation = adUseClient 

    If cmbSearch.Text = "Last Name" Then 
    rec.Open "Select * From Table1 where [Last Name] like '" & txtSearch.Text & "'", connSearch, adOpenDynamic, adLockOptimistic 
    frmStudents.cmdShowall.Enabled = True 
    If rec.EOF Then 
     MsgBox "No Student Found.", vbInformation, "Error" 

    Else 
     Set frmStudents.StudentTable.DataSource = rec 
     MsgBox "Student found Successfully", vbInformation, "Success" 
     ' Remove previously saved bookmark from collection 
    If (frmStudents.StudentTable.SelBookmarks.Count <> 0) Then 
     frmStudents.StudentTable.SelBookmarks.Remove 0 
    End If 
     ' Append your bookmark to the collection of selected rows 
    frmStudents.StudentTable.SelBookmarks.Add rec.Bookmark 
     frmSearch.Hide 
    End If 
    End If 
End Sub 

Danke für die Hilfe. :)

EDIT: Verschieben Code aus Kommentaren hier

Private Sub Form_Load() 
    connSearch.Open connstr 'open the connection 
    frmStudents.Adodc1.ConnectionString = conn.connstr 
    Set frmStudents.StudentTable.DataSource = frmStudents.Adodc1 
End Sub 
+0

Das tut nicht sehe wie das Beispiel aus. Sollte Ihre Datagrid-Datenquelle nicht auf das gesamte Recordset gesetzt werden - nicht nur auf den passenden Nachnamen? Wo ist Ihr Formularladungscode, der das Datagrid füllt? – dbmitch

+0

Das sieht so aus, als wäre es Teil eines Moduls und kein Formular - befindet es sich in derselben Form? Oder zeigen Sie uns nur eine Art von extrahiertem Code? – dbmitch

+0

Ich habe zwei Formen, eine für die Suche nach den Studenten und eine für die DataGrid und Kontrollen. Der Code, den ich in der Frage angegeben habe, ist ein Auszug aus dem Suchformular. Der nächste Kommentar zeigt den Formularladecode, der das Datagrid und die Datenbank abruft. –

Antwort

1

Sie müssen einen Re-Cord werden mit der frmStudents.Adodc1 Datenquelle zu füllen, aber aus irgendeinem Grunde wollen Sie nicht, dass Code zu erhalten.

Dann versuchen Sie in dem Code, den Sie versuchen, ein neues Re-Cord-Set zu öffnen, um nach dem Student zu suchen, und ein Lesezeichen zuzuweisen. Das wird nicht funktionieren.

Wenn Sie alle Schüler anzeigen möchten - wie im Beispiel gezeigt - müssen Sie die Datenquelle alleine lassen und die Suche auf dem gleichen Recordset ausführen, das von Ihrem Datagrid verwendet wird.

Es ist schwer für mich zu erraten, was das ist, da Sie mir nicht den Code des Formulars zeigen - ich nehme an, das Recordset ist global mit dem Modul des Formulars - aber vielleicht nicht?

Ohne diese Informationen kann ich etwas erraten, in der Hoffnung, vielleicht wird die Übersetzung funktionieren.

Ersetzen Sie diese

rec.Open "Select * From Table1 where [Last Name] like '" & txtSearch.Text & "'", connSearch, adOpenDynamic, adLockOptimistic 
frmStudents.cmdShowall.Enabled = True 
If rec.EOF Then 
    MsgBox "No Student Found.", vbInformation, "Error" 

Else 
    Set frmStudents.StudentTable.DataSource = rec 
    MsgBox "Student found Successfully", vbInformation, "Success" 
    ' Remove previously saved bookmark from collection 
If (frmStudents.StudentTable.SelBookmarks.Count <> 0) Then 
    frmStudents.StudentTable.SelBookmarks.Remove 0 
End If 
    ' Append your bookmark to the collection of selected rows 
frmStudents.StudentTable.SelBookmarks.Add rec.Bookmark 
    frmSearch.Hide 

Mit diesem

Dim varBookmark as Variant 

With frmStudents.StudentTable 

    varBookMark = .Bookmark 

    ' Remove previously saved bookmark from collection 
    If (.SelBookmarks.Count <> 0) Then 
     .SelBookmarks.Remove 0 
    End If 
    .Recordset.Find "[Last Name] like '" & txtSearch.Text & "'" 
    ' If Find method fails, notify user 
    ' If the search fails, the Recordset will point to either EOF or BOF. 
    If .Recordset.EOF or .Recordset.BOF Then 
     Msgbox "No Student Found" 
     ' Reset back to last selection 
     .Recordset.Bookmark = varBookmark 
    Else 
     Msgbox "Student Found" 
    .SelBookmarks.Add .Recordset.Bookmark 
    Endif 

End With 

Im Idealfall würde man nur das Re-Cord-Variable verwenden, die Sie anstelle von frmStudents.Adodc1.Recordset zu frmStudents.Adodc1 zugewiesen, aber Sie haben nicht mit anderen geteilt das mit mir so vielleicht funktioniert das für Sie

+1

das ist genau das, was ich brauche danke, aber ich brauche Verifizierung, dass, wenn der Nachname nicht existiert es zeigt eine msgbox sagen "Benutzer nicht gefunden". Wenn jetzt der letzte Name nicht existiert, heißt es: ** Entweder BOF oder EOF ist True, oder der aktuelle Datensatz wurde gelöscht. Angeforderte Operation erfordert einen aktuellen Datensatz. ** –

+0

Versuchen Sie oben bearbeiten, die auf NoMatch überprüft – dbmitch

+0

Es funktioniert nicht, da ** NoMatch ** nicht nach dem Recordset –