none
Fehler Datagridview(GetPreferredSize) - VirtualMode RRS feed

  • Frage

  • Guten Tag,

    Ich habe den virtuellen Modus beim Datagridview implementiert.

    Es kommt ab und zu ein Fehler, wie kann ich diesem umgehen bzw an was könnte es liegen?

     

    bei System.Windows.Forms.DataGridViewTextBoxCell.GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, Int32 rowIndex, Size constraintSize)
       bei System.Windows.Forms.DataGridViewCell.GetPreferredWidth(Int32 rowIndex, Int32 height)
       bei System.Windows.Forms.DataGridViewCell.OnCellDataAreaMouseEnterInternal(Int32 rowIndex)
       bei System.Windows.Forms.DataGridViewCell.OnMouseMoveInternal(DataGridViewCellMouseEventArgs e)
       bei System.Windows.Forms.DataGridView.OnCellMouseMove(DataGridViewCellMouseEventArgs e)
       bei System.Windows.Forms.DataGridView.UpdateMouseEnteredCell(HitTestenfo hti, MouseEventArgs e)
       bei System.Windows.Forms.DataGridView.OnMouseMove(MouseEventArgs e)
       bei System.Windows.Forms.Control.WmMouseMove(Message& m)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.DataGridView.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    
    

    Fehler:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    Autosize sind auf off:

             AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
             AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

    Danke


    Freitag, 2. September 2011 05:33

Antworten

  • Hallo Bernhard,

    genauer kannst Du den Fehler analysieren, wenn Du den Source Server Support aktivierst.
    Windows Forms wird darüber auch zur Verfügung gestellt.

    Als Warnung vorne weg: Das DataGridView ist hübsch verschachtelt, unter Spaß versteht man was anderes ;-)

    Kleine Analyse ohne das:
    Wenn Du den Virtual Mode verwendest, so könnte es sein, dass dort  nicht immer der erwarteten Wert (Datentyp) geliefert wird.
    So ruft GetPreferredSize den formatierten Wert ab, siehe GetFormattedValue, um darüber die Maße der Zelle zu berechnen.
    Auch anderen StackTraces könnten darauf hinweisen.

    Weitere Möglichkeit: Wenn Du mit andere CellStyles verwendest, prüfe ob die Formate zu den Daten passen.

    Um es genauer einzugrenzen könnte man die zuletzt abgerufenen Werte zusammen
    mit den Zeilen/Spaltenindizes bei CellValueNeeded in einen Ringpuffer (Liste) zwischenspeichern,
    um leichter erkennen zu können, woran sich das DataGridView gerade verschluckt hat.

    Gruß Elmar

    Freitag, 2. September 2011 07:53
    Beantworter

Alle Antworten

  • Hallo Bernhard,

    anhand deines geposteten StackTraces ist nicht so wahnsinnig viel zu erkennen. Aber eine NullReferenceException deutet darauf hin, dass irgendwo ein Objekt erwartet wurde, dass nicht vorhanden ist.

    Gibt es innere Exceptions und falls ja was sagen diese aus? Kannst du bitte etwas Code posten?

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es
    Freitag, 2. September 2011 06:25
  • Das Problem ist, dass ich den Fehler nicht nachvollziehen kann, d.h er tritt ab und zu auf bzw hat die Implementation des Datagrids insgesammt schon mehr als 6000 Zeilen.

    Kann ich den Fehler abfangen und die Zelle eventuell leer darstellen?

    Gibt es eine einfache Möglichkeit, dass der DatagridView meine eigene Implementation der DataGridViewTextBoxCell aufruft?

    Dann hätte ich die Möglichkeit den Fehler genauer zu Analysieren bzw abzufangen.....


    Freitag, 2. September 2011 06:37
  • Folgende Fehler treten auch genauso "oft" auf:

     

    bei System.Windows.Forms.DataGridViewColumnHeaderCell.GetheritedStyle(DataGridViewCellStyle inheritedCellStyle, Int32 rowIndex, Boolean includeColors)     
    bei System.Windows.Forms.DataGridViewCell.GetErrorIconBounds(Int32 rowIndex)
    bei System.Windows.Forms.DataGridViewCell.UpdateCurrentMouseLocation(DataGridViewCellMouseEventArgs e)
    bei System.Windows.Forms.DataGridViewCell.OnMouseMoveInternal(DataGridViewCellMouseEventArgs e)
    bei System.Windows.Forms.DataGridView.OnCellMouseMove(DataGridViewCellMouseEventArgs e)
    bei System.Windows.Forms.DataGridView.UpdateMouseEnteredCell(HitTestenfo hti, MouseEventArgs e) bei System.Windows.Forms.DataGridView.OnMouseMove(MouseEventArgs e)
    bei System.Windows.Forms.Control.WmMouseMove(Message& m)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.DataGridView.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

     

     

     

    bei System.Windows.Forms.DataGridViewCell.GetEditedFormattedValue(Object value, Int32 rowIndex, DataGridViewCellStyle& dataGridViewCellStyle, DataGridViewDataErrorContexts context)     
    bei System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    bei System.Windows.Forms.DataGridViewRow.PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
    bei System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
    bei System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded) bei System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
    bei System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
    bei System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
    bei System.Windows.Forms.Control.WmPaint(Message& m) bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.DataGridView.WndProc(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)    
    bei System.Windows.Forms.DataGridView.PaintColumnHeaders(Graphics g, Rectangle clipBounds, Boolean singleBorderAdded)
    bei System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
    bei System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
    bei System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
    bei System.Windows.Forms.Control.WmPaint(Message& m)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.DataGridView.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    bei System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)     
    bei System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestenfo hti, Boolean isShiftDown, Boolean isControlDown)
    bei System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    bei System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
    bei Ispro.Browser.Controls.ModulDataGridPaged.OnMouseDown(MouseEventArgs e)
    bei System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.DataGridView.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


     

     



    Freitag, 2. September 2011 06:50
  • Hallo Bernhard,

    genauer kannst Du den Fehler analysieren, wenn Du den Source Server Support aktivierst.
    Windows Forms wird darüber auch zur Verfügung gestellt.

    Als Warnung vorne weg: Das DataGridView ist hübsch verschachtelt, unter Spaß versteht man was anderes ;-)

    Kleine Analyse ohne das:
    Wenn Du den Virtual Mode verwendest, so könnte es sein, dass dort  nicht immer der erwarteten Wert (Datentyp) geliefert wird.
    So ruft GetPreferredSize den formatierten Wert ab, siehe GetFormattedValue, um darüber die Maße der Zelle zu berechnen.
    Auch anderen StackTraces könnten darauf hinweisen.

    Weitere Möglichkeit: Wenn Du mit andere CellStyles verwendest, prüfe ob die Formate zu den Daten passen.

    Um es genauer einzugrenzen könnte man die zuletzt abgerufenen Werte zusammen
    mit den Zeilen/Spaltenindizes bei CellValueNeeded in einen Ringpuffer (Liste) zwischenspeichern,
    um leichter erkennen zu können, woran sich das DataGridView gerade verschluckt hat.

    Gruß Elmar

    Freitag, 2. September 2011 07:53
    Beantworter
  • Den Virtual Mode mit "allen" Features des Datagridviews ohne Virtual Mode zu implementieren hat auch nicht mit viel spass zu tun ;)

    Ich werde mich jetzt mal in den .net Sourcecode schmeissen und schaun was ich herausfinden kann.

     

    Danke für die Hilfe.

    Freitag, 2. September 2011 08:00
  •  class MyDataGridViewTextBoxColumn:DataGridViewColumn
        {
            public MyDataGridViewTextBoxColumn()
                : base(new MyDataGridViewTextBoxCell())
            {
                
            }
    
    
        }
    
        public class MyDataGridViewTextBoxCell : DataGridViewTextBoxCell
        {
    
            public MyDataGridViewTextBoxCell()
      
            {
    
            }
    
            protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize)
            {
                return new Size(-1, -1);
            } 
        }

    -> Muss die Lösung sein ;)
    Performance ist jetzt sogar besser :D
    Freitag, 2. September 2011 13:08
  • -> Muss die Lösung sein ;)
    Performance ist jetzt sogar besser :D

     

    Hallo Bernhard Schub,

    Könntest Du Dein Problem lösen? Wenn ja, es wäre schön und hilfreich, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.

    Ø  Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
    [Quelle:
    Forenregeln]

    Wie bewerte ich einen Beitrag? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
    [Quelle:
    Häufig gestellte Fragen]

    Danke und Grüße,

    Robert

    Donnerstag, 8. September 2011 07:10
    Moderator
  • Hallo Bernhard Schub,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Freitag, 9. September 2011 06:34
    Moderator
  • Eine Erklärung zur NullReferenceException.

    Mittwoch, 28. September 2011 18:33