Hi All,
dies ist mein Code:
DataGridViewColumn kLieferposition = new DataGridViewTextBoxColumn();
kLieferposition.Name = "kLieferpos";
kLieferposition.HeaderText = "kLieferpos";
DataGridViewComboBoxColumn anzahl = new DataGridViewComboBoxColumn();
anzahl.Name = "anzahl";
anzahl.HeaderText = "Anzahl";
anzahl.ValueMember = "Value";
anzahl.DisplayMember = "Description";
DataGridViewColumn cartnr = new DataGridViewTextBoxColumn();
cartnr.Name = "cartnr";
cartnr.HeaderText = "Artnr";
DataGridViewColumn Beschreibung = new DataGridViewTextBoxColumn();
Beschreibung.Name = "Beschreibung";
Beschreibung.HeaderText = "Beschreibung";
DataGridViewColumn Preis = new DataGridViewTextBoxColumn();
Preis.Name = "Preis";
Preis.HeaderText = "Preis";
dgv_lieferpositionen.Columns.AddRange(kLieferposition, anzahl, cartnr, Beschreibung, Preis);
DataTable lieferpositionen = helper.lade_lieferpositionen((int)Lieferdatenrow[2]);
foreach (DataRow lieferpos in lieferpositionen.Rows)
{
try
{
DataTable data = new DataTable();
data.Columns.Add(new DataColumn("Value", typeof(int)));
data.Columns.Add(new DataColumn("Description", typeof(string)));
int menge = Convert.ToInt32(lieferpos[4]);
for (int i = 0; i <= menge; i++)
{
data.Rows.Add(i, i.ToString());
}
anzahl.DataSource = data;
dgv_lieferpositionen.Rows.Add(lieferpos[1], anzahl, lieferpos[3], lieferpos[5], lieferpos[6]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Nun bekomme ich immer eine Exeption von dem DGV das das Format nicht korrekt ist.
Wenn ich aber die Datasource data zu einer neuen cmb auf meinem form zuweisen ist alles korrekt.
Ich habe hier schon etliches im Forum durchsucht. Leider ohne erfolg. Dort wird immer nicht dynamisch zugewiesen wie in meinem Fall.
Bei mir ändern sich mit jeder Row auch die Items der cmb.
Wo liegt mein Fehler?
Gruß Dustin
Hallo DRottmann,
bitte exakte Angaben: welche Exception mit welchem Exception-Text in welcher Zeile (StackTrace), siehe [Hinweis] Wie poste ich richtig? Punkt 5.
herbivore
Hi herbivore,
das hätte ich gerne gemacht. Leider kommt ein Popup mit der Exeption: siehe Anhang.
Gruß Dustin
Fang die Exception, wie es in [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt [finden und beheben] beschrieben wurde, dann kommst du auch an die benötigten Informationen. Siehe auch [Tipp] Strg-C kopiert MessageBox-Inhalt, dann kann findet man die Meldung auch über die Forensuche.
Hallo DRothmann,
gibt es einen speziellen Grund dass die dgv_lieferpositionen nicht mit eine DataTable als DataSource versehen wird?
Ich würde versuchen hier mit einem SQL (stored proceudre / function) die DGV zu befüllen. Einen Formatfehler würde hier auch schneller erkannt werden.
Viele Grüße,
telfa
EDIT: Hallo noch einmal.
Der Fehler deutet darauf hin dass in einer Zeile ein Wert steht der nicht im Source der DataGridViewCombobBox-Cell enthalten ist.
Viele Grüße,
telfa
DataTable lieferpositionen enthält die Spalte "nAnzahl" zb. 3
Nun muss ich aber daraus eine Combobox im Grid machen mit den Werten 0 -> 3 damit der User auswählen kann.
Heißt würde ich die Datatable zuweisen habe ich ja nicht die Row Combobox.
Oder stehe ich hier auf dem Schlauch?
Gruß Dustin
EDIT: Hi,
mir ist die Exeption schon klar. Meine Frage ist es wie ich es richtig zuweisen muss.
es geht hier um die DatagridviewColumn "Anzahl" die eine Combobox beinhalten soll.
Keiner eine Idee?
Gruß Dustin
Hallo DRothmann,
eine DataGridViewComboBoxColumn kann auch einer DGV mit einer DataTable als DataSource zugeordnet werden. Dabei wird die Column, die als Combobox angezeigt und genutzt werden soll, durch eine zur Laufzeit erstelle DataGridViewComboBoxColumn ersetzt:
Viele Grüße,
telfa
Hi,
ich habe den Code nach deiner Anleitung umgestellt leider führt es nicht zum Erfolg.
Hier mein Code:
DataGridViewColumn kLieferposition = new DataGridViewTextBoxColumn();
kLieferposition.Name = "kLieferpos";
kLieferposition.HeaderText = "kLieferpos";
DataGridViewColumn anzahltext = new DataGridViewTextBoxColumn();
anzahltext.Name = "Menge";
anzahltext.HeaderText = "Menge";
DataGridViewColumn cartnr = new DataGridViewTextBoxColumn();
cartnr.Name = "cartnr";
cartnr.HeaderText = "Artnr";
DataGridViewColumn Beschreibung = new DataGridViewTextBoxColumn();
Beschreibung.Name = "Beschreibung";
Beschreibung.HeaderText = "Beschreibung";
DataGridViewColumn Preis = new DataGridViewTextBoxColumn();
Preis.Name = "Preis";
Preis.HeaderText = "Preis";
dgv_lieferpositionen.Columns.AddRange(kLieferposition, anzahltext, cartnr, Beschreibung, Preis);
DataTable lieferpositionen = helper.lade_lieferpositionen((int)Lieferdatenrow[2]);
dgv_lieferpositionen.DataSource = lieferpositionen;
dgv_lieferpositionen.Columns[0].Visible = false;
dgv_lieferpositionen.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dgv_lieferpositionen.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
foreach (DataRow lieferpos in lieferpositionen.Rows)
{
try
{
DataTable data = new DataTable();
data.Columns.Add(new DataColumn("Value", typeof(int)));
data.Columns.Add(new DataColumn("Description", typeof(string)));
int menge = Convert.ToInt32(lieferpos[4]);
for (int i = 0; i <= menge; i++)
{
data.Rows.Add(i, i.ToString());
}
DataGridViewComboBoxColumn anzahl = new DataGridViewComboBoxColumn();
anzahl.DataPropertyName = "Menge";
anzahl.Name = "anzahl";
anzahl.HeaderText = "Anzahl";
anzahl.ValueMember = "Menge";
anzahl.DisplayMember = "Description";
anzahl.DataSource = data;
dgv_lieferpositionen.Columns.Insert(1,anzahl);
dgv_lieferpositionen.Columns.Remove("Menge");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Hi,
ich hatte doch schon geschrieben das es keine normale Exeption gibt!
Auch beim debuggen kommt das Popup erst nachher.
Hast du viellecht überlesen nicht schlimm.
Vielleicht kannst du mir ja aber weiterhelfen!
Es muss doch möglich sein die Combobox neu zu erstellen und dann alles dem DGV zuzuweisen.
Gruß Dustin
Hast du viellecht überlesen nicht schlimm.
Genau, schlimmer ist nämlich, dass du den verlinkten Beitrag offensichtlich auch nicht genau genug gelesen hast:
Wie man eine Exception fangen kann, wenn man nicht weiß, wo sie geworfen wird
Eine Exception wird in der umgekehrten Reihenfolge, in der die Methoden einander aufgerufen haben, nach oben geworfen und zwar bis zum ersten try/catch auf das sie trifft oder - wenn es ein solches nicht gibt - bis ganz oben (unhandled exception). Wenn die Exception nicht durch ein bestehendes try/catch "weggefangen" wird, kann man die Exception also ganz oben abfangen. Ganz oben ist im Main-Thread die Main-Methode und für andere Threads deren ThreadStart-Methode bzw. deren Entsprechung, z.B. bei BackgroundWorker der DoWork-EventHandler.
Statt die Exception mit try/catch abzufangen, kann man sie auch unbehandelt lassen und die entsprechenden Events abonnieren, um ihrer habhaft zu werden, als da wären AppDomain.UnhandledException (für alle Anwendungsarten), Application.ThreadException (für Windows-Forms-Anwendungen) und Application.DispatcherUnhandledException (für WPF-Anwendungen).
Man muss jedoch nicht unbedingt den Code ändern, um an die Exception zu kommen. In Visual Studio kann im Menü "Debug"/"Exceptions" eingestellt werden, dass der Debugger bei einer Exception automatisch hält. Dazu ist in "Common Language Runtime Exceptions" bei "Thrown" der Haken zu setzen. Diese Einstellung gilt für die aktuelle Solution.
Tritt nun eine Exception auf, so hält der Debugger an der betreffender Stelle und über die DataTips (mit der Maus über eine Variable fahren) können die Werte der Variablen geprüft werden.
Außerdem sagt doch die Messagebox, wie du an die Exception kommst (via Event).
Hallo DRottmann,
das führt so alles nicht zum Ziel.
Welches Problem tritt denn wann auf?
Hast Du überprüft ob in der DataSource für die ComboBoxColumn alle Werte enthalten sind als Menge im DGV auftreten?
Viele Grüße,
telfa
Wußte gar nicht, daß man bei WinForms in eine DataGridViewComboBoxColumn, eine mehrspaltige DataTable stopfen kann...
Wie sieht das dann aus ? Hätte wer ein Screenshot ?
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
Es wird zusätzlich zur Tabelle auch angegeben, welche Spalte als Datenquelle für die Combobox-Spalte herhalten soll. Daraus ergibt sich, das es eben nur die Daten der einen Spalte sind, die angezeigt werden.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Ach ja, stimmt ! 🙂 Hätte besser schauen sollen.. 8o
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
mir scheint, das DAtagridView hat überhaupt keine DataSource. Möglicherweise geht das dann nicht mit ComboboxColumns.
Aber ich mach sowas eh immer im Designer - kennst du das, wie das im Designer geht?
Der frühe Apfel fängt den Wurm.