Laden...

DGV Combobox hinzufügen mit Werten während Rows Add Methode wirf Exception wegen Format

Erstellt von DRottmann vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.041 Views
D
DRottmann Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren
DGV Combobox hinzufügen mit Werten während Rows Add Methode wirf Exception wegen Format

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

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo DRottmann,

bitte exakte Angaben: welche Exception mit welchem Exception-Text in welcher Zeile (StackTrace), siehe [Hinweis] Wie poste ich richtig? Punkt 5.

herbivore

D
DRottmann Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Hi herbivore,

das hätte ich gerne gemacht. Leider kommt ein Popup mit der Exeption: siehe Anhang.

Gruß Dustin

Hinweis von herbivore vor 10 Jahren

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.

T
156 Beiträge seit 2012
vor 10 Jahren

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

D
DRottmann Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

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

T
156 Beiträge seit 2012
vor 10 Jahren

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:

  • DataTable der DGV zuweisen
  • neue DataGridViewComboBoxColumn erstellen
  • DataPropertyName erhält die Spalte aus der DataSource des DGV
  • DataSource = DataSource der Combobox-Auswahl
  • DisplayMember = im DataGridViewComboBoxColumn anzuzeigender Wert
  • ValueMember = im DataSource der DGV zu speichender Wert der Spalte
  • alte Coumn entfernen
  • über Columns.Insert die neue Columns an der Stelle der alten einfügen.

Viele Grüße,
telfa

D
DRottmann Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

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);
                          
                        }
                     }

5.658 Beiträge seit 2006
vor 10 Jahren

bitte exakte Angaben: welche Exception mit welchem Exception-Text in welcher Zeile (StackTrace), siehe
>
Punkt 5.

Weeks of programming can save you hours of planning

D
DRottmann Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

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

5.742 Beiträge seit 2007
vor 10 Jahren

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).

T
156 Beiträge seit 2012
vor 10 Jahren

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

T
461 Beiträge seit 2013
vor 10 Jahren

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... 😄

2.298 Beiträge seit 2010
vor 10 Jahren

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 |

T
461 Beiträge seit 2013
vor 10 Jahren

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... 😄

5.299 Beiträge seit 2008
vor 10 Jahren

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.