none
DataGridView und ComboBox RRS feed

  • Frage

  • Hallo Leute,
    ich fülle eine DataGridViewComboBox mittels:

    For Each myObject as CmyObject in MyObjektArray
           .Add(myObject)
    next

    Wenn ich nun in einer DataGriedView-Zeile auf die ComboBox klicke, dann wird mir auch bei jedem Eintrag unterhalb der ComboBox der Text angezeigt, der durch die ToString-Methode innerhalb der Klasse CmyObject erzeugt wird. Ich kann auch einen Eintrag aus der ComboBox selektieren.
    Wenn ich jedoch den Focus von dieser DGV-ComboBox wegbringe, dann bekomme ich die Fehlermeldung: "Der DataGridViewCellBox-Wert ist ungültig"

    Es funktioniert aber, wenn ich die ComboBox so fülle:
    For Each myObject as CmyObject in MyObjektArray
           .Add(myObject.ToString)
    next

    Ich möchte aber trotzdem, dass ich der ComboBox die Objekte selbst halte und nicht nur noch die Texte der ToString-Methode.
    Wie geht das?

    Vielen Dank im Voraus

    Christian Tauschek

     

    Dienstag, 5. Oktober 2010 12:27

Antworten

  • Hallo Christian,

    die ComboBox der DataGridVieComboBoxColumn hat per
    Default immer den DropDownStyle = DropDownList. Man
    kann sich zwar einen Verweis auf die ComboBox holen und
    dieser dann den DropDownStyle = DropDown verpassen,
    was aber nichts am Verhalten der ComboBoxColumn ändert,
    sprich von der DropDownListe abweichende Werte werden
    dennoch nicht übernommen.

    Wenn Du eine entspr. Funktionalität brauchst, kannst Du entweder
    das DataGrid, wie in meinem Beispiel

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGrid
                -> DataGridComboBoxColumn

    gezeigt verwenden, oder Du musst Dir selbst eine entspr.
    DataGridViewTextBoxColumn bauen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 8. Oktober 2010 06:48

Alle Antworten

  • Hallo Christian,

    ich fülle eine DataGridViewComboBox mittels:

    For Each myObject as CmyObject in MyObjektArray
    .Add(myObject)
    next

    Das sagt leider nichts darüber, wo in Deinem Code
    Du dieses MyObjektArray befüllst und wie und wo
    Deine DataGridViewComboBoxColumn an diese
    gebunden wird.

    Wenn ich nun in einer DataGriedView-Zeile auf die ComboBox
    klicke, dann wird mir auch bei jedem Eintrag unterhalb der
    ComboBox der Text angezeigt, der durch die ToString-Methode
    innerhalb der Klasse CmyObject erzeugt wird. Ich kann auch
    einen Eintrag aus der ComboBox selektieren.
    Wenn ich jedoch den Focus von dieser DGV-ComboBox
    wegbringe, dann bekomme ich die Fehlermeldung:
    "Der DataGridViewCellBox-Wert ist ungültig"

    Es funktioniert aber, wenn ich die ComboBox so fülle
    For Each myObject as CmyObject in MyObjektArra
    .Add(myObject.ToString
    next

    Ich möchte aber trotzdem, dass ich der ComboBox die
    Objekte selbst halte und nicht nur noch die Texte der
    ToString-Methode.
    Wie geht das?

    Unter

        www.gssg.de -> Visual Basci -> VB.net
            -> DataGridView
                -> DataGridViewComboBoxColumn

    gibt es ein Beispiel für ein DGV mit DataGridViewComboBoxColumn.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 5. Oktober 2010 15:56
  • Hallo Peter,
    danke für deine Antwort. (Hat soweit geklappt)
    Ich habe aber noch eine Frage zu einer DGV mit einer ComboBoxSpalte unabhängig zu deinem Bespiel.

    Angenommen ich habe ein DGV mit einer ComboBoxSpalte, deren ComboBox-Auswahl mit Strings gefüllt ist:
    zB.:
    "Text1"
    "Text2"

    Wenn ich nun aber bei diesem DGV eine neue Zeile hinzufüge mittels myDGV.Rows.Add("andererText"), dann sollte doch in dieser neuen ComboBox-Zelle der Text "andererText" erscheinen. Ich bekomme aber beim Hinzufügen die Fehlermeldung, dass der ComboBoxCell-Wert ungültig ist.
    Mit der ComboBox-Auswahl sollte dann aber trotzdem die Auswahl zwischen "Text1" und "Text2" möglich sein und somit "andererText" ersetzen.
    Der Datentyp (String) ist aber richtig eingestellt.

    Wie kann ich das lösen? (Eigentlich müsste man das DropDownStyle der ComboBox von "DropDownList" auf "DropDown" umstellen, damit auch Werte in der Zelle dargestellt werden können, die nicht in der ComboBox-Auflistung vorkommen - oder?)

    mfg

    Christian

     

    Mittwoch, 6. Oktober 2010 20:27
  • Hallo Christian

    Hallo Peter,
    danke für deine Antwort. (Hat soweit geklappt)
    Ich habe aber noch eine Frage zu einer DGV mit einer
    ComboBoxSpalte unabhängig zu deinem Bespiel.

    Angenommen ich habe ein DGV mit einer ComboBoxSpalte,
    deren ComboBox-Auswahl mit Strings gefüllt ist:

    Wie, wo, wann (Code) füllst Du diese CombBoxSpalte mit Strings?

    zB.:
    "Text1"
    "Text2"

    Wenn ich nun aber bei diesem DGV eine neue Zeile hinzufüge
    mittels myDGV.Rows.Add("andererText"), dann sollte doch in
    dieser neuen ComboBox-Zelle der Text "andererText" erscheinen.

    Nein, weil "anderer Text" nicht in der DropDownListe der
    ComboBox steht und somit ein unzulässiger Wert ist.

    Ich bekomme aber beim Hinzufügen die Fehlermeldung, dass
    der ComboBoxCell-Wert ungültig ist.

    Gültig sind nur Werte, die in der DropDownListe der Combobox
    stehen.

    Mit der ComboBox-Auswahl sollte dann aber trotzdem die Auswahl
    zwischen "Text1" und "Text2" möglich sein und somit "andererText"
     ersetzen.
    Der Datentyp (String) ist aber richtig eingestellt.

    Mit dem DatenTyp hat das nichts zu tun.

    Wie kann ich das lösen? (Eigentlich müsste man das DropDownStyle
    der ComboBox von "DropDownList" auf "DropDown" umstellen,

    und genau das ist nicht möglich.
    Die ComboBox einer DataGridViewComboBoxColumn hat
    immer den DropDownStyle = DropDownList.

    damit auch Werte in der Zelle dargestellt werden können,
    die nicht in der ComboBox-Auflistung vorkommen - oder?)

    Da müsstest Du Dir eine eigene ComboBoxColumn mit einer
    entspr. "variableren" ComboBox bauen.
    Für das DataGrid habe ich mal so eine ComboBoxColumn
    erstellt, bei der man den DropDownstyle wie bei einer
    normalen ComboBox wählen kann. Du findest das im
    Beispiel unter

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGrid
                -> DataGridComboBoxColumn

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 7. Oktober 2010 10:54
  • Hallo Peter,
    dein Beispiel baut auf einem DataGrid auf und nicht auf einem DGV.

    Habe zufällig heute gesehen, dass du bei einem Posting (im Vorjahr) auf die fast gleiche Frage folgende Antwort gegeben hast:

    ---------------------------------------------------------------------
    Hallo Martin,

    > Kann man das DataGridViewComboBoxColumn nicht
    > auf die DropDownStyle "DropDown" setzen?

    Die in dieser Column gehostete ComboBox kann man
    zwar auf DropDownStyle = DropDown setzen, was aber
    alleine nicht genügt, da die Zellen in dieser Spalte die
    abweichenden Werte dennoch nicht übernehmen.

    Bisher ist es mir nicht gelungen mit dem DGV eine
    mit halbwegs vertretbarem Aufwand erzielbare
    Lösung zu finden. Mit dem DataGrid lässt sich
    das leichter realisieren und macht von der Optik
    keinen Unterschied.
    ---------------------------------------------------------------------

    Ist das jetzt auch noch aktuell, denn ich möchte trotzdem unbedingt beim DGV bleiben?

    mfg
    Christian


    Donnerstag, 7. Oktober 2010 15:31
  • Hallo Christian,

    die ComboBox der DataGridVieComboBoxColumn hat per
    Default immer den DropDownStyle = DropDownList. Man
    kann sich zwar einen Verweis auf die ComboBox holen und
    dieser dann den DropDownStyle = DropDown verpassen,
    was aber nichts am Verhalten der ComboBoxColumn ändert,
    sprich von der DropDownListe abweichende Werte werden
    dennoch nicht übernommen.

    Wenn Du eine entspr. Funktionalität brauchst, kannst Du entweder
    das DataGrid, wie in meinem Beispiel

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGrid
                -> DataGridComboBoxColumn

    gezeigt verwenden, oder Du musst Dir selbst eine entspr.
    DataGridViewTextBoxColumn bauen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 8. Oktober 2010 06:48