ComboboxColumn crash on exit

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Fortender.

    ComboboxColumn crash on exit

    Hallo,
    ich hab ein DataSet, dass aus 3 Tables besteht.

    Quellcode

    1. Entry:
    2. ID - Int32; Autoincrement; Primärschlüssel
    3. Hi - Int32
    4. Lo - Int32
    5. Asm_ID - Int32 (Beziehung zu Table Asm, ID)
    6. Asm:
    7. ID - Int32; Autoincrement; Primärschlüssel
    8. Name - String
    9. Cmd_ID - Int32 (Beziehung zu Table Cmd, ID)
    10. Cmd:
    11. ID - Int32; Autoincrement; Primärschlüssel
    12. Name - String


    Anzeigen lasse ich mir das in einem DataGridView, das bei CellClick ein DialogForm aufruft in dem die Daten
    der CurrentRow geändert werden können. Probleme macht die ComboboxColumn des DataGridViews scheinbar.
    Beim Schließen bekomme ich die
    Fehlermeldung:
    Spoiler anzeigen
    ---------------------------
    Standard-Fehlerdialogfeld für DataGridView
    ---------------------------
    DataGridView-Ausnahme:

    System.ArgumentException: Der DataGridViewComboBoxCell-Wert ist ungültig.

    Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu ersetzen.
    ---------------------------
    OK
    ---------------------------

    Ich befülle das Ganze so:

    VB.NET-Quellcode

    1. Private Sub frm_main_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    2. Dim names As String() = New String() {"SAKE", "FAKE", "TAKE", "LAKE", "RAKE"} 'Nur Testwerte :P
    3. Dim cmd As String() = New String() {"ab->mc", "mc->ab", "d->s", "k->z"} 'Nur Testwerte :P
    4. With TestDt
    5. .Clear()
    6. For Each s In cmd
    7. .Cmd.AddCmdRow(s)
    8. Next
    9. For Each s In names
    10. .Asm.AddAsmRow(s, .Cmd(rnd(0, cmd.Length - 1)))
    11. Next
    12. For i = 0 To 30
    13. .Entry.AddEntryRow(0, 0, .Asm(rnd(0, .Asm.Count - 1)))
    14. Next
    15. End With
    16. End Sub


    Wenn ich die ComboboxColumn mit einer TextBoxColumn ersetze funktioniert das Ganze.
    Was kann ich tun :D

    MfG Tim

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Fortender“ ()

    Fortender schrieb:

    Ich befülle das Ganze so:
    Was ist str?
    Einer ComboBoxColumn kannst Du nur Werte selektieren, die ihr zugewiesen wurden. Ist das der Fall?
    Überzeuge Dich davon, dass da nicht ein falsches oder fehlendes Item rumlungert.
    Setze einen Haltepunkt rein und sieh Dir die möglichen Items und das selektierende Item an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    eine Combo-Column musst du halt richtig konfigurieren, sodass ihre Values jeden Wert annehmen können, der in der anzuzeigenden Spalte auftritt.
    Ansonsten passierts, dass in einer Zelle Werte stehen, die die Combo nicht anzeigen kann - ungültige Werte, wie der Fehler dich wissen lässt.

    Welche Werte treten in der anzuzeigenden Spalte auf, und wie hast du die Combo konfiguriert?

    Edit: Ach, der Fehler kommt erst beim Schließen? betrifft er das geschlossene Form oder das MainForm?
    Beim Schließen werden ja BindingSources disposed, und dadurch verlieren ComboboxColumns manchmal ihre Gültigkeit - also von daher kenne ich sonen Fehler.

    ErfinderDesRades schrieb:

    Also ich nehme jetzt mal an, die bemeckerte ComoColumn sitzt auf dem geschlossenen Form - nicht auf dem, was offen bleibt, und dessen Werte geändert wurden.

    Ich verstehe nicht genau was du meinst.
    Auf meiner main-Form ist ein DGV, dass bei einem CellClick ein DialogForm aufruft mit dem man
    die Daten in einer Art DetailView ändern kann. Logischerweise kann dann nur die ComboboxColumn auf der main-Form liegen,
    da auf der DialogForm keine ComboColumn sitzt sondern lediglich eine normale Combobox.

    Ich habe mir nochmal deine Anti-Tückmethode angeschaut und scheinbar funktioniert es damit. Keine Fehlermeldung kein Absturz.
    Danke :)

    MfG Tim

    Fortender schrieb:

    Logischerweise kann dann nur die ComboboxColumn auf der main-Form liegen
    sorry - das ist nicht logischerweise.
    Ich hab öfters DialogForms auch mit DGVs drauf, und in den DGVs in den DialogForms (also nicht: im main-Form) auch ComboColumns.
    Also das wundert mich, wenn meine AntiTücken-Methode auch ein DGV "rettet", was gar nicht auf dem Form drauf ist, was geschlossen wird.
    Naja, wenn du willst kann ich mal ein kleines Filmchen machen und zeigen wie ich vorgegangen bin. Eventuell findest du ja Fehler
    in meiner Vorgehensweise. Würde mich mal interessieren.
    Aber wie gesagt. Nur wenn nicht zu beschäftigt dafür bist ;)

    MfG Tim
    glaub einfacher wäre, du würdest ein Testprojekt produzieren und anhängen, was den Fehler reproduziert.

    Auch finde ich da wahrscheinlicher den Fehler, als wenn ich deim Filmle zugucke, und iwas wesentliches ist versäumt zu zeigen.

    Aber ich guck auch gerne dein Filmle, wenn dir das weniger Aufwand macht.
    also im Film haste alles richtig gemacht, und der Fehler ist halt der, von dem ich auch rede, und für den ich die Anti-Tücken-Methode gebastelt hab.

    Nur von diesen Problem aus post#1:

    Fortender schrieb:

    Anzeigen lasse ich mir das in einem DataGridView, das bei CellClick ein DialogForm aufruft in dem die Daten
    der CurrentRow geändert werden können. Probleme macht die ComboboxColumn des DataGridViews scheinbar.
    kommt nix vor.
    Das hatte ich so verstanden, dass du ein 2. Form hast, und Anwendung spinnt, wenn du das 2.Form geöffnet hast und wieder schließt.
    Also da hab ich dich falsch verstanden bzw. du hast was falsches erzählt.

    jedenfalls der Fehler, der in deim Film auftritt ist im Tut doch erklärt:

    das Tut schrieb:

    Tücke beim Schließen: WinForms hat den Bug, dass beim Schließen erst die Components disposed werden (also auch die BindingSources), danach erst die Controls.
    Da meckern dann die ComboColumns rum, wenn ihnen ihre DataSource unterm Hintern weg-disposed wird.

    Deshalb die Methode frmPhonebook_FormClosed()


    Also dann spar ich mir die Testmappe erstmal, oder ist da noch weitergehendes drinne?

    ErfinderDesRades schrieb:

    Also dann spar ich mir die Testmappe erstmal, oder ist da noch weitergehendes drinne?

    Nope, dann haben wir wohl aneinander vorbeigeredet.
    Dann aber nochmal vielen Dank, dass du dir das angeschaut hast und für die Hilfe.
    Wie kommt das eigentlich, dass wenn man das DataSet "cleared" und dann wieder anfängt Rows hinzuzufügen, dass die Indizierung dann nicht wieder bei dem definierten
    Seed beginnt, sondern bei dem letzten Index weitermacht?
    Ist mir mal so aufgefallen.

    MfG