vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2022
 
zurück

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

VB.NET - Ein- und Umsteiger
DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Bazi
Datum: 13.01.22 15:07

Hallo,
in einem meiner Programme nutze ich ein DGV mit OwnerDraw. Auf meiner Entwicklungsrechner funktioniert das wunderbar, jedoch auf anderen Rechnern nicht.
Ist das Neuzeichnen vom Arbeitsspeicher abhängig?

Auf den anderen Rechnern werden die einzelnen Zellen in der Headerzeile erst gezeichnet wenn ich diese anklicke, die Zellen der einzelnen Zeilen werden gezeichnet wenn ich den Zeilenheader anklicke oder im DGV scrolle.

Wechsle ich auf eine andere Tabpage im Programm und dann wieder zurück, sehe ich in dem Bereich des DGV den entsprechenden Bereich der Tabpage wo ich vorher war.
Nach einem horizontlalen Bildlauf im DGV sieht alles recht kryptisch aus und wird auch erst wieder nach scrollen oder anklicken der Header neu gezeichnet.

Der Einbau eines DGV.Refresh beim wechsel der Ansicht brachte keinen Erfolg.

An was könnte das liegen?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Manfred X
Datum: 14.01.22 10:34

Hallo!

Schwer zu sagen. Ich tippe auf eine Ereigniskette.
Es könnte sein, dass in der Zeichenroutine Ereignisse ausgelöst werden,
die als Konsequenz wiederum die Zeichenroutine aufrufen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Bazi
Datum: 14.01.22 20:40

aber dann müsste das auf meinem Entwicklungsrechner doch auch sein?
Hier mal der Code.
Das Paint:
Private Sub NotizDataGridView_CellPainting(ByVal sender As Object, ByVal e As _
  System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles _
  NotizDataGridView.CellPainting
        If loading Then Return
        If e.RowIndex = -1 Then
            If e.ColumnIndex = 2 Then
                Dim dgv = CType(sender, DataGridView)
                Using s As New IO.FileStream(IO.Path.Combine( _
                  Application.StartupPath, "Filter.ico"), IO.FileMode.Open)
                    Dim img = AutoSizeImage(Image.FromStream(s), 20, 20)
                    GridDrawCustomHeaderColumns(CType(sender, DataGridView), e, _
                      img, DGVHeaderImageAlignments.SingleRight)
                End Using
            ElseIf e.ColumnIndex = 3 Then
                GridDrawCustomHeaderColumns(CType(sender, DataGridView), e, _
                  Nothing, DGVHeaderImageAlignments.Default)
            Else
 
            End If
        End If
        If e.ColumnIndex < 1 OrElse e.RowIndex < 0 Then Return
        If loading OrElse DataSet.Beenden Then Return
        Try
            If NotizDataGridView.Columns(e.ColumnIndex).DataPropertyName = _
              DataSet.Notiz.KurztextColumn.ColumnName Then
                If NotizBindingSource.At(Of NotizRow)( _
                e.RowIndex).GetAufgabeRows.Count > 0 Then
                    Dim img As Image = Nothing
                    Dim nr = NotizBindingSource.At(Of ProjektDts.NotizRow)( _
                      e.RowIndex)
                    If Not nr Is Nothing AndAlso nr.GetAufgabeRows.Count > 0 Then
                        For Each ar In nr.GetAufgabeRows
                            If Not ar.IsErinnerungNull AndAlso ar.Erinnerung _
                              > Date.MinValue Then
                                img = ImageList1.Images(70) : Exit For ' 70 = 
                                ' Wecker
                                NotizDataGridView.Rows(e.RowIndex).Cells( _
                                  e.ColumnIndex).ToolTipText = "Erinnerung am " _
                                  & ar.Erinnerung.ToString
                            ElseIf Not ar.IsLangtextNull AndAlso _
                            ar.Langtext.Length > 0 Then
                                img = ImageList1.Images(71) ' 71 = 
                                ' Schraubenschlüssel
                            End If
                        Next
                    End If
 
                    If img Is Nothing Then Return
                    Dim bc As System.Drawing.Color = e.CellStyle.BackColor  ' 
                    ' NotizDataGridView.Rows(e.RowIndex).Cells( 
                    ' e.ColumnIndex).Style.BackColor
                    If bc = Color.Transparent Then bc = Color.WhiteSmoke
                    Using sb As New SolidBrush(bc)
                        e.Graphics.FillRectangle(sb, e.CellBounds)
                    End Using
                    Dim mask = DataGridViewPaintParts.All Xor _
                      DataGridViewPaintParts.ContentBackground ' zeichne alles 
                    ' ausser Hintergrund, den machen wir.
                    e.Paint(e.CellBounds, mask)
                    img = AutoSizeImage(img, e.CellBounds.Height - 20, _
                      e.CellBounds.Height - 20)
                    If img Is Nothing Then Return
                    e.Graphics.DrawImage(img, New Rectangle(e.CellBounds.Right _
                      - (img.Width + 3), e.CellBounds.Top + 2, img.Width, _
                      img.Height))
                    e.Handled = True
                End If
            End If
        Catch ex As Exception
            InfoBox(ex.Message)
        End Try
    End Sub

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Bazi
Datum: 14.01.22 20:43

und hier noch die Sub für die HeaderColumns:
Private Sub GridDrawCustomHeaderColumns(ByVal dgv As DataGridView, _
 ByVal e As DataGridViewCellPaintingEventArgs, ByVal img As Image, _
     ByVal Style As DGVHeaderImageAlignments)
        ' All of the graphical Processing is done here.
        Dim gr As Graphics = e.Graphics
        gr.FillRectangle( _
         New SolidBrush(dgv.ColumnHeadersDefaultCellStyle.BackColor), _
         e.CellBounds)
        If img IsNot Nothing Then
            Select Case Style
                Case DGVHeaderImageAlignments.FillCell
                    gr.DrawImage( _
                     img, e.CellBounds.X, e.CellBounds.Y, _
                     e.CellBounds.Width, e.CellBounds.Height)
                Case DGVHeaderImageAlignments.SingleCentered
                    gr.DrawImage(img, _
                     ((e.CellBounds.Width - img.Width) \ 2) + _
                       e.CellBounds.X, _
                     ((e.CellBounds.Height - img.Height) \ 2) + _
                       e.CellBounds.Y, _
                     img.Width, img.Height)
                Case DGVHeaderImageAlignments.SingleLeft
                    gr.DrawImage(img, e.CellBounds.X, _
                     ((e.CellBounds.Height - img.Height) \ 2) + _
                       e.CellBounds.Y, _
                     img.Width, img.Height)
                Case DGVHeaderImageAlignments.SingleRight
                    gr.DrawImage(img, _
                     (e.CellBounds.Width - img.Width) + _
                       e.CellBounds.X, _
                     ((e.CellBounds.Height - img.Height) \ 2) + _
                       e.CellBounds.Y, _
                     img.Width, img.Height)
                Case DGVHeaderImageAlignments.Tile
                    Dim br As New System.Drawing.TextureBrush(img, _
                      Drawing2D.WrapMode.Tile)
                    gr.FillRectangle(br, e.ClipBounds)
                Case Else
                    gr.DrawImage( _
                     img, e.CellBounds.X, e.CellBounds.Y, _
                     e.ClipBounds.Width, e.CellBounds.Height)
            End Select
        End If
        If e.Value Is Nothing Then
            e.Handled = True
            Return
        End If
        Using sf As New StringFormat
            With sf
                Select Case dgv.ColumnHeadersDefaultCellStyle.Alignment
                    Case DataGridViewContentAlignment.BottomCenter
                        .Alignment = StringAlignment.Center
                        .LineAlignment = StringAlignment.Far
                    Case DataGridViewContentAlignment.BottomLeft
                        .Alignment = StringAlignment.Near
                        .LineAlignment = StringAlignment.Far
                    Case DataGridViewContentAlignment.BottomRight
                        .Alignment = StringAlignment.Far
                        .LineAlignment = StringAlignment.Far
                    Case DataGridViewContentAlignment.MiddleCenter
                        .Alignment = StringAlignment.Center
                        .LineAlignment = StringAlignment.Center
                    Case DataGridViewContentAlignment.MiddleLeft
                        .Alignment = StringAlignment.Near
                        .LineAlignment = StringAlignment.Center
                    Case DataGridViewContentAlignment.MiddleRight
                        .Alignment = StringAlignment.Far
                        .LineAlignment = StringAlignment.Center
                    Case DataGridViewContentAlignment.TopCenter
                        .Alignment = StringAlignment.Center
                        .LineAlignment = StringAlignment.Near
                    Case DataGridViewContentAlignment.TopLeft
                        .Alignment = StringAlignment.Near
                        .LineAlignment = StringAlignment.Near
                    Case DataGridViewContentAlignment.TopRight
                        .Alignment = StringAlignment.Far
                        .LineAlignment = StringAlignment.Near
                End Select
              End With
            With dgv.ColumnHeadersDefaultCellStyle
                gr.DrawString(e.Value.ToString, .Font, _
                 New SolidBrush(.ForeColor), e.CellBounds, sf)
            End With
        End Using
        e.Handled = True
    End Sub

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Kuno60
Datum: 15.01.22 00:28

Hallo,

dieses Verhalten ist mir bekannt. Es kann auftreten, wenn Daten fehlerhaft sind, Dateien fehlen (z.B. "Filter.ico"), Pfade nicht stimmen, Daten falsch geladen werden, usw.. Anscheinend wird bei dir der Fehler abgefangen (Try-Block, DataError-Ereignis oder globale Fehlerbehandlung) und bleibt unbemerkt. Dadurch wird das Programm ausgebremst, da der Fehler beim Zeichnen jeder einzelnen Zelle auftreten kann. Das DGV verhält sich dann merkwürdig.

Grüße, Kuno
---------------
Hobbyprogrammierer
VB6 bis VB16

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Manfred X
Datum: 15.01.22 08:18

Hallo!

Kurz den Code angeschaut:
Die Anweisung "If Loading then Return" könnte eventuell eine Ereigniskette auslösen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Bazi
Datum: 15.01.22 14:02

Das hört sich gut an.
An die Möglichkeit dass eine Datei fehlt, wie hier evtl. das Filter.ico bin ich noch gar nicht gekommen. Das kann aber gut sein. Werde ich prüfen.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: DataGridView OwnerDraw zeichnet sich nicht immer neu 
Autor: Bazi
Datum: 17.01.22 08:53

geprüft und bestätigt.
Ich habe das nun wie in anderen Codeteilen auch schon auf die Imagelist umgestellt, nun klappt es fehlerfrei.

Der Fehler wurde im DataGridView_OnError abgefangen und blieb für mich unbemerkt.

Danke für die Hilfe

Gruß Christian

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-2022 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