Datentyp aus combobox Text auslesen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Datentyp aus combobox Text auslesen

    Moin,

    ich bin da auf ein echt peinliches Problem gestoßen.

    Ich arbeite mit 4-5 Datasets. Soweit alles gut.
    Für die Verwaltung von Tabellen ermögliche ich dem User das Bearbeiten eingeschränkt in folgender Ansicht:

    Links die Tabelle(Tabellenname) und rechts dann die Tabellenspalten.
    Im DGV füge ich eine Comboboxcolumn ein und fülle sie mit vordefinierten Datentypen.
    Jetzt möchte ich gerne bei Auswahl des richtigen Datentypes die Änderung an der Tabellenspalte vornehmen.
    Ich scheitere an folgender Zeile:

    VB.NET-Quellcode

    1. ​ dtDeviceGroup.Columns(dgvFields.Rows(dgvFields.CurrentCell.RowIndex).Cells(0).ToString).DataType = Convert.ChangeType( editingComboBox.Text,GetType( editingComboBox.Text))

    editingComboBox ist die Combobox, in der ich die Auswahl ändere.

    Ich kriege es nicht hin, aus der Combobox(String) den Datentyp auszulesen.
    Hat jemand einen einfach Tipp dafür ?

    Besten Dank schonmal
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Hallo @razzzer530i!

    Wie bindest Du die Datentypen für die Spalten denn ein? Hast Du dafür eine extra Tabelle, in welcher Du die verfügbaren Datentypen vorhälst? Denn der Datentyp "link" sieht mehr ehere nach einem Custom-Typen aus.

    Was Du machen könntest ist die über die Combobox Eigenschaft Items alle auflisten lassen und diese dann über LinQ mit

    VB.NET-Quellcode

    1. editingComboBox.Items.OfType(Of String).ToList()
    alle Einträge als String Liste ziehen und die über die SelectedIndex Property der Combobox den ausgewählten Eintrag holen.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Radinator schrieb:

    Hallo @razzzer530i!

    Wie bindest Du die Datentypen für die Spalten denn ein? Hast Du dafür eine extra Tabelle, in welcher Du die verfügbaren Datentypen vorhälst? Denn der Datentyp "link" sieht mehr ehere nach einem Custom-Typen aus.


    Ich habe ein String array in dem ich die Typennamen einfach rein schreibe(fix im quellcode). Quasi

    VB.NET-Quellcode

    1. dim arrFieldTypes as String() = {"String","Int32","Decimal"}

    Der Typ Link wird von mir abgefangen. Handelt es sich um Link dann ändere ich die Eigenschaft der späteren DGV Column auf Link, sodass ich direkt auf ein Verzeichnis oder ein Dokument verweisen kann (Hier wird ein Link zu einem Datenblatt von einem Produkt abgelegt)


    Radinator schrieb:

    Was Du machen könntest ist die über die Combobox Eigenschaft Items alle auflisten lassen und diese dann über LinQ mit

    VB.NET-Quellcode

    1. editingComboBox.Items.OfType(Of String).ToList()
    alle Einträge als String Liste ziehen und die über die SelectedIndex Property der Combobox den ausgewählten Eintrag holen.

    Lg Radinator


    Verstehe ich leider nicht so ganz. Linkq? Also aktuell schreibe ich jan ur einen String rein. Ich kann ja schlecht einen Datentyp als objekt in eine Combobox packen. Kriege das so im Code nicht hin. Verstehe aber ehrlich gesagt auch nicht all zu viel von Combobox & Datentypenverarbeitung.

    Vielleicht geht die zweite Beschreibung etwas ausführlicher ? :D Das wäre nett.

    VG :)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Was ich mich jetzt erstmal frage: Willst Du das, was der Compiler mit mehreren 100 Zeilen automatisch generiert, ersetzen? Denn letztenendes wird das dann ja so eine Art rudimentärer DataSet-Designer-Ersatz. Dann gleich die nächste Frage: Hast Du das schon mit fest codierten Typen probiert? Das würde ja dann z.B. mittels dtDeviceGroup.Columns(dgvFields.Rows(dgvFields.CurrentCell.RowIndex).Cells(0).ToString).DataType = GetType(String) laufen. Nur was dann? Hast Du das schon im Blick, was dann kommt? Wie diese tDS-Struktur abgespeichert und weiter genutzt werden kann? Um Dir einen Ansatz für Deine Problemlösung zu geben, hier ein funktionierendes Beispiel, auf dem Du aufbauen könntest. Aber irgendwie bin ich pessimistisch, dass Du den tDS-Designer so ersetzen kannst.

    VB.NET-Quellcode

    1. '...
    2. dtDeviceGroup.Columns(dgvFields.Rows(dgvFields.CurrentCell.RowIndex).Cells(0).ToString).DataType = GetTheTypeWhichIsCalled("DateTime")
    3. '...
    4. Private Function GetTheTypeWhichIsCalled(TypeName As String) As Type
    5. For Each KnownType In {GetType(String), GetType(Int32), GetType(Boolean), GetType(DateTime)}
    6. If KnownType.Name = TypeName Then Return KnownType
    7. Next
    8. Return Nothing
    9. End Function
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    THX @VaporiZed

    Also die Datasets werden als XML files weg gepackt. Ich wollte quasi einfach nur die Auswahl der möglichen Datentypen in einer Ini.dat speichern. Problem hier ist halt eben dass es nur als String geht.
    Wenn ich natürlich einfach alle Datentypen im Code abrufe und deren Namen checke, komme ich natürlich zum richtigen Ergebnis.
    Danke schonmal dafür.

    Da wäre noch die Frage, wie liste ich alle Datentypen richtig auf?
    Da hätten wir ja System.String, System.text und blablabla. Also die Datentypen stehen ja nicht explizit in einer Klasse. Ich benötige eigentlich nur die Combobox die man in den Projekteinstellungen der Nutzervariablen findet.
    Dort kann man ja auch den Datentyp für eine Variable definieren.
    Ich probere es aber erstmal damit.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    Ich benötige eigentlich nur die Combobox die man in den Projekteinstellungen der Nutzervariablen findet.
    Keine Ahnung, welche Du meinst. Ich hätt jetzt eiskalt die ganzen Typen hardgecoded, die im tDS-Designer zur Verfügung stehen:

    Allerdings könntest Du auch z.B. alles mögliche an Klassen einbauen (ich habe es späßleshalber mal mit Control probiert, klappt auch), aber das ist ja dann ein Fass ohne Boden. Ich würde mich daher nur auf jene Typen und notfalls zusätzlich ein paar beschränken, die von Deinen Nutzern gewollt sind (obwohl das natürlich u.U. ausufern könnte). Aber in ne Object-Spalte kann man ja eh alles reinhauen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Also ich habe jetzt erstmal die für mich wichtigen wirklich hardgecoded. Der Nutzer soll extrem eingeschränkt werden um Fehler zu vermeiden. Jedoch muss das DIng so flexibel sein, dass ich als Admin nicht im Code rumbasteln muss. Somit die ideale Lösung gefunden. > Läuft jetzt auch vernünftig.

    Wenn ich jetzt dem Typen wechsel, gucke ich, ob die Datacoulmn irgendwo Daten enthält. Falls ja frage ich ob die raus sollen. Ist dem so lösche ich sie und generiere sie neu mit entsprechendem Datentypen. Einfach ändern geht nicht.
    Bilder
    • läuft.png

      35,73 kB, 690×512, 288 mal angesehen
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    Verstehe ich leider nicht so ganz. Linkq?
    Nicht LinkQ, sondern LinQ (oder LINQ, Language INtegrated Query)

    Damit hast du eine einfache und komfortable Möglichkeit mit Arrays und Listen im .NET Framework zu arbeiten.

    razzzer530i schrieb:

    Ich kann ja schlecht einen Datentyp als objekt in eine Combobox packen.

    Und was machst Du bisher? Du hast im Code ein Array Objekt stehen, welches Du der Eigenschaft "Items" der Combobox übergibst. Die Eigenschaft Items ist eine Combobox.ObjectCollection. Das ist ein Ableger des Interfaces IEnumerable. Diese wiederum liegt dem Array zugrunde. Damit kannst Du die Combobox.Objectcollectionn mittels der Linq-Erweiterung .OfType() in eine Liste von Strings konvertieren. Diese Liste kann wie ein Array betrachetet werden. Auf das Element greifst Du dann nur noch über den Index des ausgewählten Eintrages zu.

    razzzer530i schrieb:

    Verstehe aber ehrlich gesagt auch nicht all zu viel von Combobox & Datentypenverarbeitung.
    Ist nur eine Ausrede. Wenn Du schon versuchst sowas mit DataSets und DataGridViews zu basteln, also auf Daten "im großen Stil zuzugreifen", dann solltest Du dich auf jeden Fall mit Linq beschäftigen.


    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell