| |
VB.NET - Ein- und UmsteigerDataGridView 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 | |
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. | |
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 | |
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 | |
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. | |
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. | |
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 | |
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 | |
| 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 |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|