Laden...

System.InvalidCastException auf System.Data.DataRowView

Erstellt von UHM vor 2 Jahren Letzter Beitrag vor 2 Jahren 489 Views
U
UHM Themenstarter:in
22 Beiträge seit 2009
vor 2 Jahren
System.InvalidCastException auf System.Data.DataRowView

Hallo,

ich habe eine Klasse Buddy, die Elemente einer BindingList darstellen soll:



    public class Buddy
    {
      private string name;
      private int id;
      public Buddy() { }
      public Buddy(string nameForPart, int numberForPart)
      {
        Komponentenname = nameForPart;
        IdBuddy = numberForPart;
      }

      public string Komponentenname
      {
        get { return name; }
        set { name = value; }
      }

      public int IdBuddy
      {
        get { return id; }
        set { id = value; }
      }
    }


Die Liste wird dann im Prinzip folgendermaßen einem DataGridView zugeteilt:


      BindingList<Buddy> blBuddy;

      blBuddy = new BindingList<Buddy>();

     /* füllen der Buddyliste */

      komponentenBuddyBindingSource.DataSource = blBuddy;
      this.idBuddyDataGridViewTextBoxColumn.DataSource = this.komponentenBuddyBindingSource;

Dabei wird nur eine Spalte über diese BindingList gefüllt, für die anderen Spalte ist allesamt die Tabelle direkt als BindingSource angegeben.

Beim Start ist das DataGridView erst einmal unsichtbar. Sobald ich es auf visible = true setze erhalte ich allerdings folgenden Fehler, falls die DataTable nicht leer ist:

Fehlermeldung:
Das Objekt des Typs "Buddy" kann nicht in Typ "System.Data.DataRowView" umgewandelt werden.

In einer einfacheren Testanwendung ohne anderen Spalten und auf einem einfachen DataSet basierend funktioniert das so. Warum hier nicht? Stört da die andere Bindung?

Gruß
UHM

J
61 Beiträge seit 2020
vor 2 Jahren

Grundsätzlich verstehe ich nicht, warum so etwas überhaupt funktionieren sollte. Irgendwo muss doch eine Logik in Code enthalten sein, die die Einträge deiner beiden Datenquellen verknüpft.

Zum Fehler: was sagt denn der Debugger? Damit kommt man dem Pudels Kern doch sehr nah.

Und woher kommt übrigens die Datasource Eigenschaft der DataGridViewTextBoxColumn? Ich finde sie nicht in der Dokumentation.

U
UHM Themenstarter:in
22 Beiträge seit 2009
vor 2 Jahren

Der Debugger sagt für mich leider nicht viel - er kann die Daten der Spalte nicht auswerten (ContentBounds, EditedFormattedValue, FormattedValue, PreferredSize, da steht es löst diese Exception aus). Der Value ist aber sichtbar (z.B. DBNull oder 1). Und bei der Zeile .visible = true kommt dann

Fehlermeldung:
System.InvalidCastException
HResult=0x80004002
Nachricht = Das Objekt des Typs "Buddy" kann nicht in Typ "System.Data.DataRowView" umgewandelt werden.
Quelle = System.Data
Stapelüberwachung:
bei System.Data.DataColumnPropertyDescriptor.GetValue(Object component)
bei System.Windows.Forms.DataGridViewComboBoxCell.ItemFromComboBoxDataSource(PropertyDescriptor property, Object key)
bei System.Windows.Forms.DataGridViewComboBoxCell.LookupDisplayValue(Int32 rowIndex, Object value, Object& displayValue)
bei System.Windows.Forms.DataGridViewComboBoxCell.GetFormattedValue(Object value, Int32 rowIndex, DataGridViewCellStyle& cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
bei System.Windows.Forms.DataGridViewComboBoxCell.GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, Int32 rowIndex, Size constraintSize)
bei System.Windows.Forms.DataGridViewCell.GetPreferredWidth(Int32 rowIndex, Int32 height)
bei System.Windows.Forms.DataGridViewColumn.GetPreferredWidth(DataGridViewAutoSizeColumnMode autoSizeColumnMode, Boolean fixedHeight)
bei System.Windows.Forms.DataGridView.AutoResizeColumnInternal(Int32 columnIndex, DataGridViewAutoSizeColumnCriteriaInternal autoSizeColumnCriteriaInternal, Boolean fixedHeight)
bei System.Windows.Forms.DataGridView.AutoResizeAllVisibleColumnsInternal(DataGridViewAutoSizeColumnCriteriaInternal autoSizeColumnCriteriaFilter, Boolean fixedHeight)
bei System.Windows.Forms.DataGridView.OnGlobalAutoSize()
bei System.Windows.Forms.DataGridView.OnHandleCreated(EventArgs e)
bei System.Windows.Forms.Control.WmCreate(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.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Das passiert tief im Inneren von .NET, da kann ich nicht debuggen.

"idBuddyDataGridViewTextBoxColumn" ist nicht direkt eine Eigenschaft, eher ein abgeleiteter Name. Den erstellt der Designer von Visual Studio automatisch sobald man das DataGridView anlegt. Leider ändert er ihn dann nicht mit wenn man die Spalte von der Textbox in eine ComboBox umstellt. Eigentlich ist damit die ComboBox-Spalte gemeint.


    private System.Windows.Forms.DataGridViewComboBoxColumn idBuddyDataGridViewTextBoxColumn;

      // 
      // idBuddyDataGridViewTextBoxColumn
      // 
      this.idBuddyDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
      this.idBuddyDataGridViewTextBoxColumn.DataPropertyName = "IdBuddy";
      this.idBuddyDataGridViewTextBoxColumn.DataSource = this.komponentenBuddyBindingSource;
      this.idBuddyDataGridViewTextBoxColumn.DisplayMember = "Komponentenname";
      this.idBuddyDataGridViewTextBoxColumn.HeaderText = "Buddy";
      this.idBuddyDataGridViewTextBoxColumn.Name = "idBuddyDataGridViewTextBoxColumn";
      this.idBuddyDataGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
      this.idBuddyDataGridViewTextBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
      this.idBuddyDataGridViewTextBoxColumn.ValueMember = "IdBuddy";
      this.idBuddyDataGridViewTextBoxColumn.Width = 62;

P
441 Beiträge seit 2014
vor 2 Jahren

Das DaraGrid in WinForms habe ich nie verwendet, würde aber um dem Problem weiter einzugrenzen:
Schau was an der Klasse, mit der es funktioniert hat anders ist oder versuche es mit einem minimalen Beispiel in einem separaten Projekt einzugrenzen.

16.806 Beiträge seit 2008
vor 2 Jahren

Das passiert tief im Inneren von .NET, da kann ich nicht debuggen.

Doch, auch das kannst Du mit entsprechenden Symbols debuggen, musst Du nur aktivieren.
Der Fehler wird aber nicht aus dem tief Inneren kommen, sondern an Deiner Klasse liegen.

Übrigens: wenn Du mit einem englischen System entwickeln würdest, was immer zu empfehlen ist, dann bekommst Du auch die englischen Fehlermeldungen, mit denen Du mehr Treffer bei Google und Co bekommst.

Deine ganzen Eigenschaften kannst auch von


 public string Komponentenname
  {
    get { return name; }
    set { name = value; }
  }

auf


public string Komponentenname {get;set;}

kürzen.
Dazu gibts auch Code Guidelines, an die man sich halten kann 😉
Und wenn ichs richtig weiß, dann kannst Du die BindingList nicht in die Quelle von BindingSource hauen.
Du kannst das ja alles direkt in die Source werfen.

Grundsätzlich verstehe ich nicht, warum so etwas überhaupt funktionieren sollte. Irgendwo muss doch eine Logik in Code enthalten sein, die die Einträge deiner beiden Datenquellen verknüpft.

Passiert (bei manchen Dingen) durch Reflection im Innern von Forms.

U
UHM Themenstarter:in
22 Beiträge seit 2009
vor 2 Jahren

Das ganze auf Englisch zu bringen und so nach Fehlern zu googeln ist auch nicht das Problem, nur dann dort etwas zu finden das auf dem gleichen Problem beruht ist nicht wirklich möglich. Gibt genug andere Fehlerdiskussionen bei denen es eben nicht um diese BindingList-Konstellation geht und da nicht wirklich helfen.
Daß die Ursache nicht im inneren von .NET liegt ist mir schon klar, aber es ging ja auch ums Debuggen. Meist hilft da dann schon zu sehen was da im inneren für Prüfungen schief laufen um dann zu sehen was außen falsch eingefüttert wurde. Aber das ist erstmal nicht. Ich schau mal ob ich das irgendwie aktivieren kann.

Aber das mit der BindingSource-Zuweisung war's. Zumindest für's erste funktioniert das.

Bis denne und vielen Dank ...
UHM

16.806 Beiträge seit 2008
vor 2 Jahren

... das hab ich übrigens deshalb als potentielle Lösungs gesagt, weil ich nach der englischen Fehlermeldung gegoogelt habe und dort genau das stand 😉