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
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;
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
Läuft, besten Dank und schönen Abend noch. 🙂
Hallo,
ich habe eine abgeleitete serialisierbare Klasse zum Speichern der Benutzterdaten im Isolated Storage. Dabei ist eine Liste mit Dateinamen in der Basisklasse, die in einer DLL ist. Leider verdoppelt sich die Liste jedes Mal beim serialisieren und wieder deserialisieren. Auszüge aus der Klasse sind dabei:
[Serializable]
public class UserData
{
public List<String> strlOtherFilename;
public List<String> OtherFilenames
{
get { return strlOtherFilename; }
}
public UserData()
{
strlOtherFilename = new List<string>();
....
}
}
[Serializable]
public class AppUserData:UserData
{
// hier ist in der ganzen abgeleiteten Klasse nichts mit den Dateinamen
...
public AppUserData()
{
...
}
}
public partial class DrawingApp : Form, IMessageFilter
{
protected UserData Benutzerdaten;
...
virtual protected void AppSaveUserData(XmlSerializer xs, IsolatedStorageFileStream userData)
{
if (null == xs)
{
xs = new XmlSerializer(typeof(UserData));
}
xs.Serialize(userData, Benutzerdaten);
}
virtual protected void AppLoadUserData(XmlSerializer xs, StreamReader sr)
{
if (null == xs)
{
xs = new XmlSerializer(typeof(UserData));
}
Benutzerdaten = (UserData)xs.Deserialize(sr);
}
virtual protected void DrawingApp_Load(object sender, EventArgs e)
{
try
{
using (IsolatedStorageFileStream userData = new IsolatedStorageFileStream(GetUserDataStorageName(), FileMode.Open))
{
if (null != userData)
{
using (StreamReader sr = new StreamReader(userData))
{
AppLoadUserData(null, sr);
}
...
}
}
}
catch
{
Benutzerdaten = new UserData();
}
...
}
override protected void AppLoadUserData(XmlSerializer xs, StreamReader sr)
{
if (null == xs)
{
xs = new XmlSerializer(typeof(AppUserData));
}
audBenutzerdaten = (AppUserData)xs.Deserialize(sr);
SetUserData(audBenutzerdaten);
}
public partial class MainApp : DLL.DrawingApp
{
protected AppUserData audBenutzerdaten;
...
override protected void AppSaveUserData(XmlSerializer xs, IsolatedStorageFileStream userData)
{
...
if (null == xs)
{
xs = new XmlSerializer(typeof(AppUserData));
}
FileStream fs = new FileStream("Test.txt", FileMode.Create);
xs.Serialize(fs, (AppUserData)audBenutzerdaten); // Testausgabe in Datei
xs.Serialize(userData, (AppUserData)audBenutzerdaten);
}
override protected void DrawingApp_Load(object sender, EventArgs e) // Event Form.Load
{
base.DrawingApp_Load(sender, e);
...
}
Benutzerdaten und audBenutzerdaten sind zwar auf dem ersten Blick 2 verschiedene Objekte, werden aber immer gleichgesetzt gehalten (Benutzerdaten = audBenutzerdaten).
In der zum Test ausgegebenen Datei, die wie ich hoffe dann identisch mit dem Isolated Storage ist, steht dann:
<?xml version="1.0"?>
<RvmConfigUserData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<strlOtherFilename>
<string>C:\...\Test.tst</string>
</strlOtherFilename>
...
<OtherFilenames>
<string>C:\...\Test.tst</string>
</OtherFilenames>
...
</AppUserData>
Für mich ist dabei etwas verwunderlich, daß dann da <OtherFilenames> mit enthalten ist, das ist ja nur ein Zugriffskonstrukt. Sollte aber eigentlich nichts bewirken, da <OtherFilenames> ja nur get besitzt und kein set.
Oder interpretiere ich da etwas falsch?
Gruß
UHM
Hallo,
Ich habe ein DataGridView, das mir verschiedene Datensätze anzeigt. Dabei kann in einer Spalte eine Referenz auf eine andere Zeile der in diesem DataGridView mittels einer ComboBox angegeben werden. In der ComboBox wird dabei ein Name dargestellt, der im Datensatz enthalten ist (String).
Nun ist es so, daß die Datensätze in diesen Fällen paarweise vorhanden sind und beide Datensätze des gleichen Paares den gleichen Namen enthalten. Es gibt zwar in einem anderen Datenfeld dann einen Zusatz, durch den die beiden Einträge unterscheidbar sind, aber in der ComboBox kann ich diesen nicht mit anfügen, da zumindest der VS-Designer da nur die Eingabe eines Feldes als DisplayMember erlaubt. In der ComboBox soll man nun eigentlich immer auf den jeweils anderen Datensatz des Paares verweisen. In nicht paarweisen Datensätzen bleibt der Verweis einfach leer.
Ich habe also z.B. folgenden Ziel-Situation:
Name Zusatz Verweis
A 1 A (2)
A 2 A (1)
B 1 B (2)
B 2 B (1)
C
D
Nun ist es allerdings so, daß wenn ich einen Verweis einstellen will, meist auch der Verweis des referenzierten Datensatzes auf sich selbst gestellt wird.
Also z.B. ich stelle A1-Verweis auf A2, dann den A2-Verweis auf A1, und wenn ich dann wieder den A1-Verweis anschaue steht dieser auf A1. Man kann dies an der markierten Position in der geöffneten ComboBox erkennen.
Evtl. passiert das nicht sofort beim Einstellen des anderen Verweises, aber spätestens wenn man die ComboBox des Datensatzes wieder aufmacht, bei der geöffneten ComboBox sieht man ja nicht, daß sich etwas ändert.
Was nicht passiert ist, daß A1 auf B1 oder B2 verstellt wird, es bleibt schon immer auf Ax. Bzw. B bleibt immer auf Bx
Das Ganze ist aber nicht Sinn der Sache. Woher kommt das, und gäbe es eine Möglichkeit das abzustellen? Oder ist es nötig den Namen auch eindeutig zu machen, damit der nicht vertauscht wird? Das wäre aber für den Rest des Programmes nicht so toll.
Viele Grüße
UHM
Wo befinden sich denn die Instanzen der Form?
Gruß
UHM
Cool.
Reiter schließen hat gereicht. Was komisch ist, weil komplettes Studio zu und wieder auf hatte nichts gebracht.
Danke.
Gruß
UHM
Hallo,
Der Designer bringt seit neuestem "Das Desingnerladeprogramm hat keine Stammkomponente bereitgestellt, aber den Grund nicht angegeben." wenn folgende Zeile in der .designer.cs aktiv ist:
this.idSubtypDataGridViewTextBoxColumn = new FilteredDataGridViewComboBoxColumn();
Dabei ist die Klasse derzeit so definiert, also einfach leer:
public class FilteredDataGridViewComboBoxColumn : DataGridViewComboBoxColumn
{
public FilteredDataGridViewComboBoxColumn()
{
// this.CellTemplate = new FilteredTypeDataGridViewComboBoxCell();
}
}
früher hatte das schon funktioniert, auch mit der Zeile in der Klasse nicht auskommentiert. Weiß nicht wie das reingekommen ist.
Bei der Suche nach dem Ursprung trat auch ein Fehler auf in etwa wie, daß der Designer die Klasse FilteredDataGridViewComboBoxColumn nicht findet. Diese ist aber im gleichen namespace.
Jemand eine Idee dazu?
Grüße
UHM
Also die Verschwinderitis kam, weil der Parent das falsche Panel war und das DataGridView dann über dieses unsichtbar blieb.
Allerdings ist immer noch der Effekt da, daß jedes Mal beim Laden der Tabelle der DataError kommt. Inzwischen habe ich festgestellt, daß der Effekt auch bei anderen DataGridViews auftritt, wenn die ComboBoxen haben.