vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen & Antworten rund um sev-Komponenten
sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: Woellmi
Datum: 27.10.16 21:14

Hallo Dieter,

ich arbeite mit dem sevDataGrid3 im ListMode und erlaube
mittels
oGrid.AllowColumnReorder=TRUE
dass der Anwender die Spalten neu anordnen kann.
Z.B. die 3. Spalte an die Position 1 ziehen.

Wenn ich nun eigene Eingabemasken über das Grid lege, nutze ich
oGrid.CellLeft(nCol)
um mein EingabeControl an die korrekte Position über das Grid zu legen.

With oGRD
  If .RowIsVisible(nRow) Then
     oTBOX.Width = .Columns(nCol).Width
     oTBOX.Height = .RowHeight
     oTBOX.Move .CellLeft(nCol) - f_nGetSevGRD3FixColsOffset(oGRD) + XOffset, _
                .CellTop(nRow, nCol) + YOffset
  End If
End With
Das funktioniert alles prima, solange die Spalten nicht verschoben wurden.

Nachdem ich die Spalten verschoben habe und z.B. die Spalte 1 an die Position
4 verschoben habe und mein Eingabefeld über die "neue" Spalte 1 platzieren will:
nCol=1  ==> .CellLeft(nCol)
'die "1" wird natürlich als Parameter übergeben ;-)
With oGRD
  If .RowIsVisible(nRow) Then
     oTBOX.Width = .Columns(1).Width
     oTBOX.Height = .RowHeight
     oTBOX.Move .CellLeft(1) - f_nGetSevGRD3FixColsOffset(oGRD) + XOffset, _
                .CellTop(nRow, 1) + YOffset
  End If
End With
dann gibt ".CellLeft(nCol)" die Position der "alten Spalte 1, nun also Spalte 4
zurück. Mein Eingabefeld liegt genau über der Zelle in der Neuen Spalte 4,
die davor Spalte 1 war.

D.h. es sieht so aus, dass die ursprünglische Spalte beim Verschieben mitwandert und
nicht neu vergeben wird.

Ist dies so gewollt?
Wenn ja, wie ist es möglich die Col-Eigenschaft der neuen ersten Spalte zu ermitteln,
oder eine Neunummerierung zu veranlassen?

Ich hoffe mich verständlich ausgedrückt zu haben

Meine Absicht ist es in einem speziellen Eingabemodus einen Referenzwert
immer an der ersten Spalte einzugeben. Dieser wird dann in alle anderen Spalten (Rechts von der ersten) übernommen.
Dazu kann der Anwender aus einer Vielzahl von verfügbaren Spalten eine auswählen und an
die erste (Linke) Position verschieben. (=> wegen der Übersicht)
Wird nun der spezielle Eingabemodus, nicht über DoppelKlick auf die betreffende Zelle, sondern
über Tastenkürzel aktiviert, gebe ich die absolute Spalte, also eine "1" an.
Dann wird die Eingabemaske der gewählten Zeile immer an der "Linken" also der ersten sichtbaren
Spalte angezeigt.

Wie gesagt vor dem Spaltenverschieben kein Problem! Mit dem Verschieben wandert die
Col-Eigenschaft mit der verschobene Spalte mit. (????)

Vielen Dank schon jetzt.

In der Hilfe habe ich leider nichts passendes gefunden.

Tschaui
Woellmi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: ModeratorDieter (Moderator)
Datum: 28.10.16 07:43

Auf die Frage, ob das so gewollt ist: ja, denn der Inhalt der usrpünglichen Spalte 1 muss ja immer der gleiche bleiben. Das gäbe sonst Chaos!

Ich habe für dich mal eben schnell eine kleine Funktion zusammengestellt, mit der sich die erste sichtbare Spalte im Grid ermitteln lässt:

' Ermittelt die erste sichtbare Spalte im sevDataGrid Control
Public Function GridGetFirstVisibleCol(ByRef oGrid As Object) As Long
  Dim i As Long
  Dim nCol As Long
  Dim nPos As Long
 
  nPos = 0
  With oGrid
    For i = 1 To .Cols
      With .Columns(i)
        If nPos = 0 Or .Position < nPos Then
          nCol = i
          nPos = .Position
        End If
      End With
    Next i
  End With
 
  GridGetFirstVisibleCol = nCol
End Function
Aufruf:
nCol = GridGetFirstVisibleCol(Grid1)

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: Woellmi
Datum: 28.10.16 08:35

Hi Dieter,

ich bin begeistert.

Irgendwie war ich etwas irritiert und vermutete einen Bug.
Da war ich schon dabei ein Hilfsarray anzulegen und das
Event: "AfterColumnDragDrop" zu Hilfe zu nehmen um die Positions-
verschiebung einzutragen.

Die Eigenschaft ".Position" hatte ich noch nicht so im Visier.

Deine Funktion habe ich fix eingebaut und alles funktioniert prima.

Vielen Dank für den Code und vor allem für die schnelle Reaktion.
Supper Support!

Bis dann

Tschaui
Woellmi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: Woellmi
Datum: 28.10.16 10:16

Hi Dieter,

auf Basis Deiner Vorlage habe ich die Funktion gleich
etwas erweitert, bzw. eine für mich weitere nützliche Funktion
geschrieben. Damit kann ich dann alle Eventualitäten erschlagen.

Public Function f_nGridGetReqVisibleCol(ByRef po_Grid As Object, _
                                        Optional ByVal n_ReqCol As Long = 1&) _
                                        As Long
    'Quelle: "GridGetFirstVisibleCol" => vb@rchiv, D. Otter, 10-2016
    '
    'Rückgabe der "Col" einer angeforderten benannten sichtbaren Spalte 
    '(Default: 1, also erste links). Liegt die angeforderte Spalte 
    'ausserhalb des Range {1 .. ".Cols"}, wird "Col" für die 
    'erste sichtbare linke Spalte zurück gegeben (Fehlerfall).
    '
    Dim nIdx As Long
    Dim nCol As Long
    Dim nPos As Long
 
    nPos = 0
 
    If n_ReqCol < 1& Or n_ReqCol > po_Grid.Cols Then
       nCol = f_nGridGetFirstVisibleCol(po_Grid)
    Else
       With po_Grid
          For nIdx = 1& To .Cols
            With .Columns(nIdx)
              If nPos = 0 Or .Position = n_ReqCol Then
                 nCol = nIdx
                 nPos = .Position
                 If .Position = n_ReqCol Then
                    Exit For
                 End If
              End If
            End With
          Next nIdx
       End With
    End If
    f_nGridGetReqVisibleCol = nCol
 
End Function
Also nochmals vielen Dank.

Tschaui
Woellmi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: ModeratorDieter (Moderator)
Datum: 28.10.16 10:20

Ganz korrekt funktioniert die Funktion hier aber nicht, da es ja vorkommen kann, dass die erste Spalte unsichtbar ist.

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: Woellmi
Datum: 28.10.16 11:56

Hi Dieter,

ja, Du hast nat. grundsätzlich recht. Darum habe ich ja auch geschrieben:

".. eine für mich nützliche Funktion.."

In meinem Programm kann keine Spalte "unsichtbar" geschalten werden.
Löschen ist zwar vorgesehen, aber dann wird ja neu angeordnet und somit
existiert jede Position von {1 .. ".Cols"}, nur eben weniger als zuvor.
Weiterhin wird diese Abfrage grundsätzlich nur im Kontext verwendet.
D.h. um dahin zu kommen, ist sichergestellt, dass überhaupt min. 2 Spalten
existieren und diese auch sichtbar sind.

Aber grundsätzlich hast Du natürlich recht. Eine ohne Bedingungen universal
verwendbare Funktion müsste dies berücksichtigen. Nur habe ich für mein Prog.
befunden, dass es an dieser Stelle nicht erforderlich ist auf Sichtbarkeit zu prüfen.
z.B. mit
if po_Grid.Columns(po_Grid.Columns(nIdx).Position).Visible Then
Denn dann müsste ja ein weiterer Durchlauf die nächste sichtbare Spalte suchen.
Und dies ist bei "mir" nicht erforderlich.
Aber, ich werde sehen dies so umzuändern, dass zukünftig auch dies berücksichtigt wird.

Aber danke für den Hinweis. Ich freue mich über jeden Hinweis, der meinen Code stabiler
macht, zumal mir dies zeigt, dass tatsächlich jemand mitdenkt.
Und dies ist heute leider nicht mehr selbstverständlich.
Bei dem "DeadLine-Stress" bleibt in der Hektik leider die Qualität oft auf der Strecke
und eine spätere Nacharbeit ist selten möglich.

Also Hut ab, es macht Spaß hier "geholfen zu werden"

Schönen Tag noch

Tschaui
Woellmi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: sevDataGrid3 und .CellLeft(nCol) nach ColumnReorder 
Autor: Woellmi
Datum: 10.11.16 21:33

Hallo zusammen, (nur zur Info)

für mein Programm habe ich 2 weitere Funktionen benötigt um festzustellen
ob eine Spalte vollständig sichtbar ist, damit ich eine eigene TextBox vollständig
in der gewünschten Spalte platzieren kann.
Sichtbar heißt in diesem Fall "nicht nach links bzw. rechts aus dem sichtbaren Bereich
des DataGrid herausgeschoben.

Als Ergebnis der Funktionen wird immer die "PositionsID", d.h. der Spaltenindex im
Ursprungszustand der Tabelle zurückgegeben. Hat man das Verschieben der Spalten erlaubt,
wandert dieser Index ja mit der verschobenen Spalte mit.

Für die Nutzung der Eigenschaft "oGrid.CellLeft(ID)" benötigt man nun aber genau
diese "ID" und nicht die lfd.-Nr. der Spalte im Grid.

Diese Funktion ermittelt die "ID" der ersten linken Spalte, welche vollständig sichtbar ist.
Public Function f_nGridGetFirstFullVisibleCol(ByRef po_Grid As Object) As Long
    Dim nIdx As Long
    Dim nCol As Long
    Dim nPos As Long
    Dim nFixColsWidth As Long
 
    nFixColsWidth = 0&
    If po_Grid.FixedColCount > 0& Then
       For nIdx = 1 To po_Grid.FixedColCount
            nFixColsWidth = nFixColsWidth + po_Grid.FixedColumns(nIdx).Width
       Next nIdx
    End If
 
    nPos = 0
 
    With po_Grid
       For nIdx = 1 To .Cols
         With .Columns(nIdx)
           If nPos = 0 Or .Position < nPos Then
              If po_Grid.ColIsVisible(nIdx) And _
                 po_Grid.CellLeft(po_Grid.Columns(nIdx).Position) >= _
                 nFixColsWidth Then
                 nCol = nIdx
                 nPos = .Position
              End If
           End If
         End With
       Next nIdx
    End With
 
    f_nGridGetFirstFullVisibleCol = nCol
 
End Function
Diese Funktion ermittelt die "ID" der letzten rechten Spalte, welche vollständig sichtbar ist.
Public Function f_nGridGetLastFullVisibleCol(ByRef po_Grid As Object) As Long
    Dim nIdx As Long
    Dim nCol As Long
    Dim nPos As Long
    Dim nFixColsWidth As Long
    Dim nMaxWidth As Long
    Dim nRightBorder As Long
    Dim nRightCellBoder As Long
 
    nFixColsWidth = 0&
    If po_Grid.FixedColCount > 0& Then
       For nIdx = 1 To po_Grid.FixedColCount
           nFixColsWidth = nFixColsWidth + po_Grid.FixedColumns(nIdx).Width
       Next nIdx
    End If
 
    nPos = 0
 
    With po_Grid
       nRightBorder = .Width - Screen.TwipsPerPixelX * .ScrollBarSize
 
       For nIdx = 1 To .Cols
 
         With .Columns(nIdx)
           If nPos = 0 Or .Position > nPos Then
              nRightCellBoder = po_Grid.CellLeft(po_Grid.Columns( _
                nIdx).Position) + _
                                po_Grid.CellWidth(po_Grid.Columns( _
                                nIdx).Position)
              If po_Grid.ColIsVisible(nIdx) And nRightCellBoder <= nRightBorder _
              Then
                 nCol = nIdx
                 nPos = .Position
              End If
           End If
         End With
       Next nIdx
    End With
 
    f_nGridGetLastFullVisibleCol = nCol
 
End Function
Mit dieser Funktion wird die "ID" der ersten (linken) wirklich, ggf. auch nur teilweise
sichtbaren Spalte ermittelt.
Public Function f_nGridGetFirstRealVisibleCol(ByRef po_Grid As Object) As Long
    Dim nIdx As Long
    Dim nCol As Long
    Dim nPos As Long
 
    nPos = 0
 
    With po_Grid
       For nIdx = 1 To .Cols
         With .Columns(nIdx)
           If po_Grid.ColIsVisible(nIdx) And (nPos = 0 Or .Position < nPos) Then
              nCol = nIdx
              nPos = .Position
           End If
         End With
       Next nIdx
    End With
 
    f_nGridGetFirstRealVisibleCol = nCol
 
End Function
Für alle, die diesen Thread verfolgen und ggf. vor ähnlichen Fragen stehen.

Tschaui
Woellmi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel