Laden...

Liste von eigener Klasse an DataSource binden

Erstellt von syn87 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.727 Views
S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren
Liste von eigener Klasse an DataSource binden

Hallo Jungs,

ich hab mal wieder ein kleines Problem beim programmieren meiner Server-Client Anwendung.

Der Client bekommt vom Server ein List<Row> Element. Row ist ein selbst erstellter Datentyp, der eine Antwortzeile der Datenbank repräsentiert.

Bei SELECT NAME, VORNAME FROM KUNDE hab ich also eine Liste von Rows, die über this["NAME"] und this["VORNAME"] die jeweiligen Daten returnen (alternativ auch this[0] und this[1]).

Wo ich jetzt Probleme habe ist beim DataSource anlegen. Im grunde genommen wäre es so, dass ich pro DB Table eine weitere Klasse anlege. Wie z.b.


class Ort {
public string Display { get { return this["ORT"]; } }
public string Value { get { return this["ORT_ID"]; } }
}

Dabei muesste Ort meiner meinung nach nur noch von Row erben und ich muesste die List<Row> auf List<Ort> casten. Geht jedoch nicht. Leider bin ich in dieser Idee relativ festgefahren und weiss nich so recht weiter. Eine neue Liste zu generieren kann ja auch nicht Sinn der Sache sein.

Hat jemand eine Idee oder anderen Ansatz?

Danke füers durchlesen und hoffentlich faellt jemanden was ein 🙂

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo syn87,

mit dem Casten bist du vollkommen auf dem Holzweg.

Willst du die ganze Liste oder jeweils nur ein Element an das Control binden?

Und noch wichtiger: An was für ein Control willst du die Daten binden?

herbivore

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren

ja das mit dem control hab ich leider vergessen. in meinem fall handelt es sich um eine combobox.

meine idee ( um nochmal darauf zu sprechen zu kommen ) war es, fuer alle moeglichen db tabellen einen typ zu erstellen, der die Row Klasse im grunde nur um 2 Eigenschaften erweitert (zur laufzeit). naemlich display und value (was man zum binden der liste ja braucht) eigenschaft.

meine momentane idee geht in die richtung, dass ich fuer alle moeglichen feldnamen eine eigenschaft in der Row Klasse anlege. zb.

public string ORT_ID { get { return this["ORT_ID"]; } }

gefaellt mir allerdings auch nicht so sehr. es ist schade dass man beim datasource binden keine funktionen mit parameter uebergeben kann 🙁 oder geht das vllt doch? hab es bisher nur mit eigenschaften gesehen.

lg matze

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo syn87,

du brauchst nicht von der Row-Klasse abzuleiten. Du kannst DataTables direkt binden. Es sollte reichen ValueMember und DisplayMember auf die Namen der entsprechenden Spalten zu setzen.

herbivore

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren

Ich hab leider noch nix von DataTable gehoert. Aber ich denke du gehst davon aus, dass das Program Zugriff auf die DB hat, was jedoch nicht so ist. Die Daten werden vom Server abgerufen und jede Zeile wird mittels eines Objekts folgender Klasse gespeichert


    [Serializable]
    public class Row
    {
        Dictionary<string, string> row;

        public Row()
        {
            this.row = new Dictionary<string, string>();
        }

        public string this[int key]
        {
            get
            {
                int i = 0;
                foreach (string k in row.Keys)
                {
                    if (i == key)
                        return this[k];
                    i++;
                }
                return "";
            }
        }

        public string this[string key]
        {
            get
            {
                return row[key];
            }
            set
            {
                row[key] = value;
            }
        }

        public bool ContainsKey(string k)
        {
            return row.ContainsKey(k);
        }

        public Dictionary<string, string>.KeyCollection Keys
        {
            get
            {
                return row.Keys;
            }
        }
}

und danach zu einer List zusammengefasst. Um die Netzwerklast zu minimieren, koennen verschiedene Listen von Rows synchronisiert werden. Aendert sich zum Beispiel die Ort Tabelle, so wird diese Liste neu verschickt. Deshalb ist der Typ beim uebertragen (List<Row>) auch nicht mehr aenderbar... (zumindest nach meinem momentanen stand) ... ja is schon kompliziert 🙁

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo syn87

Alles was Eigenschaften hat, kannst du direkt und ohne Umwege binden.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren

Ok danke.

Vllt findet sich noch jemand, der was zum eigentlichen Problem sagen kann.

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Ich hab jetzt nicht den ganzen Thread gelesen, aber ich denke/hoffe, dass folgender Thread/Beitrag hier hilft: SortedList ComboBox ID DataBinding Problem
((Die dort beschriebene Technik funktionoiert auch für DataGridView's oder ähnliches, über all wo man eine DataSource auswählen kann.))

Gruß
Juy Juka

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo syn87,

Ich hab leider noch nix von DataTable gehoert.

das kannst du ja leicht ändern.

Aber ich denke du gehst davon aus, dass das Program Zugriff auf die DB hat, was jedoch nicht so ist

Eine DataTable kann man aus einer Datenbank füllen, muss man aber nicht. Ich war nur fälschlich davon ausgegangen, dass du schon DataTable (bzw. DataRow) benutzt.

Aber DataTable ist natürlich nur eine Option, denn es gilt, was Peter Bucher gesagt hat.

Alles was Eigenschaften hat, kannst du direkt und ohne Umwege binden.

herbivore