Hallo ich weiss der Titel sagt nicht besonders viel über mein Problem aus. Aber ich versuchs mal zu beschreiben.
Ich habe mein FlexGrid, aus diesem Lese ich beim Selektieren einer zeile diverse Informationen in Textboxen aus.
Das Funktioniert auch Perfekt. Die Infos werden beim Klicken auf die Zeile ausgelesen und die Zeile wird Selektiert und hat einen Blauen Balken bzw ist Blau markiert wie es sein soll.
Nicht mehr so ganz so Rosig sieht es aus, nachdem ich mit Filtern arbeite.
Wenn ich Abmessung 1 und 2 Filtere Funktioniert das oben beschriebene Selektieren und auslesen immernoch Fehlerfrei und so wie es sein soll.
Doch Sobald ich Hersteller oder Stahlsorte zu dem Filter Hinzufüge, ist das Selektieren nicht mehr möglich.
Er Zeigt nicht mehr den Blauen Balken der anzeigt ob die Zeile Selektiert ist ABER liest die informationen aus. Jedoch die Information die er ausliest ist um eine Zeile nach Oben verschoben. Das heisst ich muss Zeile 2 Anklicken um zeile 1 Zu selektieren. Aber warum das Passiert ist mir Völlig schleierhaft. Und gerade bei diesen beiden Filtern die GENAU so funktionieren wie die AB1 und AB2.
Ich schreibe nichts an Row Col MouseRow oder sonstiges um. Das einzige was ich habe ist eine Sortierfunktion.
Private Sub DGV\_Click()
If DGV.MouseRow = 0 Then
With Me.DGV
.Redraw = False
If .MouseRow = 0 And .MouseCol \> .FixedCols - 1 Then
.Col = .MouseCol
If LastSortCol .Col Then .Tag = 0
If .Tag = 0 Or .Tag = 6 Then
.Sort = 5
.Tag = 5
LastSortCol = .Col
Else
.Sort = 6
.Tag = 6
LastSortCol = .Col
End If
.Col = 0
.Row = 0
End If
.Redraw = True
End With
Else
ZeileZeigen ' Zeigt infos aus Zeile
End If
End Sub
Aber die Funktioniert ja sonst auch Wunderbar. Hat wer eine Idee?
Hallo ich weiss der Titel sagt nicht besonders viel über mein
Problem aus. Aber ich versuchs mal zu beschreiben.
Hi digi,
Ich habe mein FlexGrid, aus diesem Lese ich beim Selektieren
einer zeile diverse Informationen in Textboxen aus.
Das Funktioniert auch Perfekt. Die Infos werden beim Klicken
auf die Zeile ausgelesen und die Zeile wird Selektiert und hat
einen Blauen Balken bzw ist Blau markiert wie es sein soll.
schön.
Nicht mehr so ganz so Rosig sieht es aus, nachdem ich mit
Filtern arbeite.
Wenn ich Abmessung 1 und 2 Filtere Funktioniert das oben
beschriebene Selektieren und auslesen immernoch Fehlerfrei und
so wie es sein soll.
Doch Sobald ich Hersteller oder Stahlsorte zu dem Filter
Hinzufüge, ist das Selektieren nicht mehr möglich.
Er Zeigt nicht mehr den Blauen Balken der anzeigt ob die Zeile
Selektiert ist ABER liest die informationen aus. Jedoch die
Information die er ausliest ist um eine Zeile nach Oben
verschoben. Das heisst ich muss Zeile 2 Anklicken um zeile 1
Zu selektieren. Aber warum das Passiert ist mir Völlig
schleierhaft.
hmmm, dann kann das Problem in der Prozedur ‚ZeileZeigen‘ liegen. Zeigst Du uns den Code auch noch?
Ohne den Code gesehen zu haben, würde ich vermuten, daß Du die Daten, die angezeigt werden aus dem gefilterten Recordset nimmst und die Nummer aus dem Flexgrid.
Beim Filtern werden aber Datensätze nur ausgeblendet und weiter mit gezählt. Die Zeilennummer stimmt dann nicht mehr mit der Datensatznummer überein. Daß sich da etwas immer um 1 verschiebt, wird an Deinen Beispielen liegen, Zufall sein. Der erste Datensatz, der angezeigt wird, kann auch Datensatz Nummer 10 oder 100 sein. Das hängt an der Menge der Daten und dem Filter.
Nene ich Filtere das Recordset und weise es dem FlexGrid zu deshalb stimmen die zeilen perfekt überein. Ich hab jetz was rausgenommen und zwar habe ich die IF abfrage herausgenommen so das es nu so aussieht:
Private Sub DGV\_Click()
With Me.DGV
.Redraw = False
If .MouseRow = 0 And .MouseCol \> .FixedCols - 1 Then
.Col = .MouseCol
If LastSortCol .Col Then .Tag = 0
If .Tag = 0 Or .Tag = 6 Then
.Sort = 5
.Tag = 5
LastSortCol = .Col
Else
.Sort = 6
.Tag = 6
LastSortCol = .Col
End If
.Col = 0
.Row = 0
End If
.Redraw = True
End With
End Sub
So funktionierts fast immer. Wenn es nicht funktioniert dann scroll ich einma runter und es funktioniert wieder perfekt.
Das mit den spalten is egal.
Private Sub DGV\_EnterCell()
Dim ArtNr As String
ArtNr = DGV.TextMatrix(DGV.Row, 9)
Nummertxt.Text = ArtNr
UND SOO WEITER .... für insg ca 30 spalten wird das gemacht.
End Sub
Das funktioniert ja.
grüße vom digi
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Nene ich Filtere das Recordset und weise es dem FlexGrid zu
deshalb stimmen die zeilen perfekt überein.
dann hab’ ich falsch geraten.
Ich hab jetz was
rausgenommen und zwar habe ich die IF abfrage herausgenommen
so das es nu so aussieht:
Private Sub DGV_Click()
With Me.DGV
.Redraw = False
If .MouseRow = 0 And .MouseCol > .FixedCols -
1 Then
.Col = .MouseCol
If LastSortCol .Col Then .Tag = 0
If .Tag = 0 Or .Tag = 6 Then
.Sort = 5
.Tag = 5
LastSortCol = .Col
Else
.Sort = 6
.Tag = 6
LastSortCol = .Col
End If
.Col = 0
.Row = 0
End If
.Redraw = True
End With
End Sub
So funktionierts fast immer. Wenn es nicht funktioniert dann
scroll ich einma runter und es funktioniert wieder perfekt.
hmmm, da sehe ich so erst mal nichts, was nur mal funktioniert. Das ist dann wohl nur mit Debuggen zu finden.
Das mit den spalten is egal.
Private Sub DGV_EnterCell()
Dim ArtNr As String
ArtNr = DGV.TextMatrix(DGV.Row, 9)
Nummertxt.Text = ArtNr
UND SOO WEITER … für insg ca 30 spalten wird das gemacht.
End Sub
30 mal der selbe Code? Du weißt aber, daß es Steuerelementefelder gibt und hattest einfach nur Lust zum Tippen, stimmt’s?
Bei mir würde da stehen:
Private Sub DGV\_EnterCell()
Dim Wert As String
Wert = DGV.TextMatrix(DGV.Row, DGV.Col)
Ausgabe(DGV.Col).Text = Wert
End Sub
Ja ok ^^ warum einfach wenns auch kompliziert geht
Naja die lösung hab ich halt genommen weil sie auf anhieb funktioniert hat und da hatte ich nich noch lust ewig rum zu basteln *g* und ich hab mehr überblick. Weil teilweise brauch ich die variablen noch mal später usw. Hat schon alles so seine richtigkeit ^^ …
Danke trotzdem für den tipp
grüße vom digi
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
So ich hab jetz ma n bisl rumprobiert.
Der nimmt als DGV.Toprow die 0. Aber es bringt mir auch nix wenn ich dem die 1 zuweise.
Dann habe ich DGV.FixedRow = 0 gesetzt und nachdem das RS gefiltert worden ist wieder auf 1. Das funktioniert. ABER nicht bei jedem. Wenn zb das DGV leer bleibt ist das Problem wieder genauso existent wie vorher für alle Filterergebnisse, die weniger haben als die sichtbaren zeilen im DGV. Erst wenn ich einen Hersteller anklicke der mehr ergebnisse liefert (sodass ein scrollbalken erscheint) funktioniert das ganze wieder. Aber nur solange, bis DGV wieder 0 einträge hat.
Ich finde es ziemlich kurrios … und mir gehen so langsam die ideen aus. Kann man irgendwie die FlexGrid.MouseRow werte editieren?
Grüße vom digi
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
ich habe ein einfaches Beispiel nachgebaut, der Fehlet tritt bei mir auch auf. Das ist ganz offensichtlich ein Bug im Flexgrid. Ich suche noch, bisher habe ich keine Abhilfe gefunden.
Private Sub Command1\_Click()
Adodc1.Recordset.Filter = ""
DoEvents
DGV.TopRow = DGV.Rows - 1
su = "Artikel-Nr \> 69"
Adodc1.Recordset.Filter = su
End Sub
Private Sub Command2\_Click()
su = "Artikel-Nr \> 90"
Adodc1.Recordset.Filter = su
End Sub
Private Sub DGV\_Click()
Label1.Caption = DGV.MouseRow
End Sub
Ist klar?
Das ist ein Bug im Flexgrid, da hat bei M$ Jemand geschlafen, damit müssen wir leben.
Also entweder Raff ichs net richtig ^^ oder bei mir funzt es nicht. Ich kopier jetz ma mein Quelltext wo ich das einfüge hier her:
Private Sub cboHersteller\_Click()
FilterLoeschen.Enabled = True
cboHerstellerText = cboHersteller.Text
Dim FilterRSName As String
'DGV.FixedRows = 0
DGV.Redraw = False
If SucheAusgefuehrt = True Then
If FilterAktiv = True Then
rsSuche.Filter = ""
DGV.TopRow = DGV.Rows + 1
FilterRSName = "Suche"
If (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
rsSuche.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf Not (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
rsSuche.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf Not (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
rsSuche.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
rsSuche.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf Not (FilterAB1txt.Text = "") And Not (StahlNummerText = "") Then
rsSuche.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
ElseIf Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
rsSuche.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
End If
ElseIf (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
rsSuche.Filter = "Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
Else
rsSuche.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
End If
Else
If FilterAktiv = True Then
rsMain.Filter = ""
DGV.TopRow = DGV.Rows + 1
FilterRSName = "Main"
If (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
rsMain.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf Not (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
rsMain.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf Not (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
rsMain.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf (FilterAB1txt.Text = "") And Not (FilterAB2txt.Text = "") And (StahlNummerText = "") Then
rsMain.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*'"
ElseIf Not (FilterAB1txt.Text = "") And Not (StahlNummerText = "") Then
rsMain.Filter = "USER\_AB1 like '\*" & FilterAB1txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
ElseIf Not (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
rsMain.Filter = "USER\_AB2 like '\*" & FilterAB2txt.Text & "\*' AND Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
End If
ElseIf (FilterAB1txt.Text = "") And (FilterAB2txt.Text = "") And Not (StahlNummerText = "") Then
rsMain.Filter = "Match1 like '\*" & cboHerstellerText & "\*' AND Dimensionstext like '\*" & StahlNummerText & "\*'"
Else
rsMain.Filter = "Match1 like '\*" & cboHerstellerText & "\*'"
End If
End If
'If (FilterRSName = "Suche") Then
' If Not rsSuche.EOF Then
' DGV.TopRow = DGV.Rows - 1
' End If
'ElseIf (FilterRSName = "Main") Then
' If Not rsSuche.EOF Then
' DGV.TopRow = DGV.Rows - 1
' End If
'End If
'SendMessage DGV.hwnd, WM\_VSCROLL, SB\_LINEDOWN, 0&
'SendMessage DGV.hwnd, WM\_VSCROLL, SB\_LINEUP, 0&
HerstellerF = True
DGV.Redraw = True
End Sub
Ich habs auf 2 wege Probiert.
Mit ner If Abfrage und n Wert der Speichert wo das Programm war damit der weiss ob der den If zweig für rsSuche oder rsMain genommen hat. Dann glotz ich ob rsMain oder rsSuche leer ist. Aber hm… ^^
Aber n Lösungsquelltext hätten die wohl nichma schreiben können…
Ich habe es jetz so gelöst:
If FilterRSsuche = True Then
If Not rsSuche.EOF Then
DGV.Redraw = True
Else
DoEvents
Me.ergDGVFilterlbl.Visible = True
rsSuche.Filter = ""
DGV.Rows = 2
DGV.FixedRows = 0
DGV.Redraw = True
DGV.FixedRows = 1
End If
ElseIf FilterRSsuche = False Then
If Not rsMain.EOF Then
DGV.Redraw = True
Else
DoEvents
Me.ergDGVFilterlbl.Visible = True
rsMain.Filter = ""
DGV.Rows = 2
DGV.FixedRows = 0
DGV.Redraw = True
DGV.FixedRows = 1
End If
End If
HerstellerF = True
Aber n Lösungsquelltext hätten die wohl nichma schreiben
können…
Testen Sie für die Bedingung eines leeren Re-Cord-Sets vor dem Binden eines Re-Cord-Sets an dem Steuerelement Hierarchical Flexgrid, um dieses Problem umzugehen. Deaktivieren Sie das Raster, und legen Sie das leere Re-Cord-Set auf der Eigenschaft Datasource nicht fest, wenn das Re-Cord-Set leer ist. Aktivieren Sie das Raster später und binden Sie das Steuerelement gewohnt, wenn ein Re-Cord-Set abgerufen wird, dass ein Re-Cord-Set Daten enthält.
da steht, ‚zeig doch kein leeres reecordset an, wenn Du weißt, daß das zu Problemen führt‘. Nein, das reicht nicht. Daß ein Kunde keine Bestellung offen hat ist durchaus ein Ergebnis, das man anzeigen können muß und danach muß dsa Programm noch weiter arbeiten können.