DataGridView: Fehler bei Column-Initialisierung (Forms)



  • Hallo Leute!

    Hier noch ne kleine DGV-Frage:

    Meinem DataGridView wird als .DataSource ein DataTable-Objekt zugewiesen. Das DGV ist in einer Form2, die von Form1 aus als Instanz erzeugt und geöffnet wird. Daten werden auch angezeigt. Dann möchte ich die grid-Columns etwas anpassen, was in dieser Procedur in Form2 geschieht:

    public void dataGVsetFormat()
    		{
    			if (this.dataGridView.ColumnCount == 11)
    				{
    					this.dataGridView.Columns[2].Width = 10;
    					this.dataGridView.Columns[2].Resizable = DataGridViewTriState.False;
    					this.dataGridView.Columns[8].Width = 10;
    					this.dataGridView.Columns[8].Resizable = DataGridViewTriState.False;
    					this.dataGridView.Columns[5].Width = 60;
    					this.dataGridView.Columns[6].Width = 60;
    				}
    		}
    

    Bei der .Width -Zuweisung kommt jedesmal folgende fehlermeldung:

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Ich habe für dieses DGC auch get/set Methoden, über die z.b. die Datasource zugewiesen wird. Die gleiche Fehlermeldung kommt aber auch wenn, wenn ich in der main-Form die Columnbreite zuweisen will. Die Resizable -property lässt sich jedoch fehlerlos setzen...

    Es muss irgendwas mit der Instanzierung, bzw. einer falschen Referenz zu tun haben. Kann mir da jemand helfen?

    Danke schonmal 🙂 und
    mfg
    tobi



  • Benutz doch mal den Debugger und schau ob überhaupt deine Columns 2,5,6 und 8 exisitieren.

    Kleiner Designtip: Einfach robust auf die Indizies zuzugreifen ohne vorher geprüft zu haben ob diese auch existieren, halte ich für etwas fragwürdig.



  • if (this.dataGridView.ColumnCount == 11)
    

    😉 s.o.



  • Auf Gleichheit würd ich nicht prüfen. Lieber ob der Count >= 11 ist. Wenn der Count nämlich 12 ist dann ist dein DGV ja dennoch valide für deine Operationen aber deine Abfrage verschluckt diesen Fakt.



  • Wieso? Die Zuweisungen werden doch so nur erst ausgeführt, wenn das DGV das richtige Format bekommen hat. Also wenn es 11 Spalten hat, sind natürlich auch alle vorhanden, denen ich was zuweise. Wenn es z.B. 12 sind, ist was falsch gelaufen und gar keine Formatierung wird vorgenommen... oder wie meint ihr das?



  • Achso, ick dachte es kann auch mehr Spalten geben, dann wars mein Missgeschick 😃



  • Ich hab diese Routine zweimal in dem Programm, 1. in der "main"-Form, wo sie auch läuft, und 2. in der Form, die aufgerufen wird und in der auch das gridView liegt. Da passiert der Fehler, also ich denk mir es hat was mit nem Referenzproblem zu tun... In c++ ist das etwas übersichtlicher, wo es zu Adresskonflikten kommt... 😉

    Edit 1:
    So, also ich hab den Fehler gefunden... und hatte hier Blödsinn geschrieben... :p
    denn Edit 2: Erst jetzt hab ich den Fehler gefunden und richtig gelöst, deshalb uppe ich das nochmal, weils glaub ich ein ganz interessantes Problem ist für Leute die mit Forms arbeiten...



  • Also: Mein Fehler war die Reihenfolge. Das ist nicht so aufgefallen, weil die einzelnen Anweisungen in verschiedenen Funktionen auftreten. Aber zusammengefasst stand es vorher so da:

    MyForm f = new MyForm();
    f.DataGridView.Columns.... // irgendwelche Formatanweisungen.. -> Fehler, da falsche Reihenfolge!!!
    f.Show();
    

    Das DataGridView wird offenbar erst mit dem Show-Befehl angelegt. Deshalb ganz klar, kam vorher die Meldung, es gibt keine Objekt-Instanz.
    Richtig ist:

    MyForm f = new MyForm();
    f.Show();   
    f.DataGridView.Columns.... // irgendwelche Formatanweisungen
    

    Ganz einfach, man muss nur drauf kommen... 😃


Anmelden zum Antworten