In DataGridView eine Reihe mit Comboboxen anlegen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    In DataGridView eine Reihe mit Comboboxen anlegen

    Hallo,
    Ich will in meinem DataGridView eine Reihe mit Comboboxen anlegen.
    Aus einem Beispiel habe ich das Vorgehen für eine Spalte gefunden, aber leider scheint das für eine Reihe nicht zu funktionieren:

    Code für Spalten:

    Dim cmb As New DataGridViewComboBoxColumn()
    cmb.HeaderText = "Select Data"
    cmb.Name = "cmb"
    cmb.MaxDropDownItems = 4
    cmb.Items.Add("True")
    cmb.Items.Add("False")
    DataGridView1.Columns.Add(cmb)

    Geht das ähnlich elegant auch für Reihen (und ich habe es bisher nur nicht gefunden), oder muss ich das irgendwie anders lösen?
    (DataGridViewComboBoxRow scheint es nicht zu geben, so daß ich das dann mit .Rows.Add(cmb) bedienen könnte...)


    Gruß, P..
    Nein, das geht nicht (oder höchstens mit äusserst kunstreichen Klimmzügen).
    Ein DGV ist keine Excel-Tabelle,wo du in jede Zelle nach Belieben reinbasteln kannst, was wolle.

    Sondern ein DGV ist ein Control zur Anzeige von Daten-Tabellen, also Listen gleichartiger Datensätze.
    Und weil jede Zeile denselben Datentyp anzeigt ist nicht vorgesehen, in verschiedenen Zeilen mal dieses mal jenen DGV-Zelltyp zu präsentieren.
    Sondern die Zelltypen werden Spaltenweise festgelegt, sodass, wenn der erste Datensatz für eine Eigenschaft etwa ein Image präsentiert (oder Checkbox, oder Combobox), dann tut es der zweite für dieselbe Eigenschaft auch, usw..
    Gibt es denn ein anderes Grid, "wo ich in jede Zelle nach Belieben reinbasteln kann, was wolle",
    wie du es ausdrückst?
    Wenn du es so willst, habe ich schon eine Liste gleichartiger Datensätze, nur daß die eben Spaltenweise angelegt sind.
    (So ist die Anforderung, kann ich leider nicht ändern)

    Wenns nicht anders geht, muss ich eben die Klimmzüge machen...
    (ah - das klingt nach einem Kalender.
    Traditionellerweise ist bei Kalendern die Zeitachse horizontal, was eben mit der vertikalen Orientierung des DGVs nicht harmonisiert.)

    Tja, zu den Klimmzügen kann ich dir nur bischen weiterhelfen. Man kann mit DGV.RowCount / .ColumnCount die Anzahl der Zellen festlegen, und man kann auch jeden Wert in jede Zelle reinschreiben.
    Aber wie man's hinkriegt den Datentyp des EditingControls beliebig festzulegen, wenn eine Zelle in den Bearbeitungsmodus geht, weissichnicht.

    Ich täte empfehlen, an der Anforderung zu rütteln. Es kann nicht wirklich im Sinne deiner Auftraggeber sein, dass du da Monate in so ein Gekrumpel investierst, und am Ende ists womöglich nichtmal stabil - von Wartbarkeit ganz zu schweigen.
    Etwa bei Kalendern ists nur eine Sekunde Kopf-Umdenken ("Aha, die Tage stehen hier untereinander, und nicht neben"), und aus einer Fast-Unmöglichkeit wird auf einmal ein Fast-Standard-Task.
    Achtung: OffTopic
    @ErfinderDesRades wenn du die Vorteile vom "Drehen" der Achsen mal sehen willst, lad dir mal die 30 Tage Testversion von infozoom.com/die-datenanalyse-software/
    Das kann schon durchaus Vorteile bringen.
    BTT:
    Ich denke nicht, dass du mit den Standardcontrols hier etwas reißen kannst.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @Phasenverschiebung Kannst Du das mal etwas motivieren?
    Wie wäre es mit einem TableLayoutPanel, da kannst Du in jede Zelle reinpacken, was immer Du willst, allerdings immer nur ein Control pro Zelle.
    Wenn da mehrere Controls rein müssen, muss zuerst ein "normales" Panel rein.
    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!
    Es geht darum, die Daten für einen Prüfablauf parametrieren zu können.
    (Die Daten werden dann umgerechnet und an eine SPS übertragen, dies nur am Rande)

    Pro Spalte soll dabei ein Prüfschritt definiert werden, in den Zeilen stehen die einzelnen Parameter (>50)
    Diese Parameter enthalten Texte oder Zahlenwerte. In einigen Zeilen brauche ich Comboboxen,
    weil nur eine bestimmte Auswahl möglich ist (z.B. „<“ oder „>“; Parameter1..10; also eben kein freier Text.)

    Die Zahlenwerte lassen sich über Textfelder und Eingabe-Beschränkung auf numerische Zeichen realisieren,
    das soll nicht das Problem sein.
    Was ich halt wirklich brauche, sind die Comboboxen, die ich in ca 10 Zeilen (für jede Spalte gleich)
    einsetzen will.
    @Rod: Ein Control pro Zelle ist ausreichend.
    Die Darstellung eines Datensatzes/Prüfschrittes pro Spalte und nicht pro Zeile ist dabei Anforderung,
    wegen der besseren Lesbarkeit (und weil deswegen in der Vergangenheit auch schon so war.)

    Ich hoffe, das hat ein bisschen Klarheit gebracht und Ihr könnt mir Ideenmäßig auf die Sprünge helfen.

    Gruß, P..
    Wie gesagt: Wenn du dir und deinen Auftraggebern einen Gefallen tun willst, rege an, die Anforderung zu ändern.
    Ihr werdet sehen: Ein senkrecht orientierter PrüfPlan ist kein Deut schlechter lesbar als ein horizontaler.

    Vorteile:
    • 2 - 10 fach schnellere Entwicklung
    • (WIeder-)Verwendung äusserst zuverlässiger Standard-Technologie
    • Unabhängigkeit von Dritt-Anbietern
    • keine Lizenz-Gebühren (naja - das ist wohl noch das geringste Problem)
    • Hilfe durch die Community ist möglich (bei Dritt-Anbietern biste eher Einzelkämpfer)
    Danke euch allen erstmal!

    Ich muss jetzt mal schauen, ob und wie ich das lösen bzw ggf umgehen kann.
    (Anforderung ist leider wirklich nicht zu ändern)
    Bin immernoch erstaunt darüber, daß es wirklich so eine Vorzugsrichtung gibt,
    daß das dgv von den Möglichkeiten her nicht symmetrisch ist... Ich bin doch sicherlich nicht der
    erste und einzige, der das Ding "anddersrum" braucht...

    @vb-fan: Hast du mit dem Vertical Grid schon gearbeitet. hast du Erfahrungswerte?

    Gruß, P..
    Dieses "andersrum" ist halt einfach in den Köpfen der Leute verankert durch Excel. Und selbst da könnte man argumentieren dass Excel einfach "falsch" benutzt wird. Wenn du es ansonsten unbedingt Spalten- und nicht Zeilenweise willst würde ich empfehlen die Werte "händisch" in das DGV zu popeln und dann die Werte nicht im DGV sondern einem seperaten Dialog Spaltenweise (normalerweise ja Zeilenweise) editierbar zu machen. So erfüllst du die Anforderung und kannst es editieren.

    Andere Variante wenn ihr Excel nachbauen wollt: nehmt Excel. Sagt zu mir zumindest immer nen Kollege...
    Zeig mal bitte ein Bild / eine Skizze aus dem man sehen kann wie das Endergebnis aussehen soll.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hier mal ein Screenshot aus der Vorgänger-VB6 Anwendung.

    Erklärung dazu:
    In "Beschreibung" ist jeglicher Text zugelassen, in Zeilen für Zahlenwerte werden im Keypress-Event alle 'nicht-Zahlen' abgefangen.
    In einigen Zeilen Wie Schrittbedingung und Abbruchbedingung soll eine Combobox mit den Einträgen "<", "=", ">" enthalten sein
    In xy-Kanal eine Combobox mit einer Auswahl an sprechenden Texten und in einigen Zeilen eine Auswahl mit " ", "0", "1"

    Gruß, P..
    Bilder
    • Ablauf.png

      22,05 kB, 569×703, 69 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Phasenverschiebung“ ()

    Kennst jetzt noch die nebeneinanderstehenden Zellen mit gleichem Inhalt verbindest, wird's fast perfekt ^^
    Nur da bist bei Custom Controls.
    Sonnst müsstest echt nen Datagrid nehmen und ohne Databinding betreiben. Ist aber sehr umständlich!
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D