Laden...

Um die richtigen Werte in einer ListBox anzuzeigen, von DataRow ableiten

Erstellt von snmigerl vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.755 Views
S
snmigerl Themenstarter:in
65 Beiträge seit 2006
vor 13 Jahren
Um die richtigen Werte in einer ListBox anzuzeigen, von DataRow ableiten

Ich möchte die tostring methode einer datarow verändern. Hierzu habe ich versucht eine Datatrow_neu von DataRow abzuleiten, nur leider klappt es nicht:


public class DataRow_neu:DataRow
    {
       
    
        public override string ToString()
        {
            string rueck = this.ItemArray[3].ToString() + " (" + this.ItemArray[2].ToString() + ")";

            return rueck;
        }



    }

Fehlermeldung beim Kompilieren:
Keine Überladung für die DataRow-Methode nimmt 0 Argumente an.

Wo liegt mein Denkfehler?

Ich kann keinen Unterschied zu diversen Beispielen für die Vererbung erkennen.

Danke

Michael

S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

geht es dir nur um ToString()?
Was hast du vor? Vielleicht ist ja IFormattable was für dich!

mfg
serial

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo snmigerl,
In DataRow gibt es keinen Standard-Konstruktor, desswegen kannst du folgenden Construktor hinzu fügen:

public DataRow_neu(DataRowBuilder db) : base(db) { }

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
snmigerl Themenstarter:in
65 Beiträge seit 2006
vor 13 Jahren

Super! Danke! Das klappt jetzt soweit. Jetzt taucht nur ein neues Problem auf:

Evtl. denke ich aber auch viel zu kompliziert, deshalb mal um was es eigentlich geht:

Ich habe drei Listboxes: lbgruppe, lbperson, lbauswahl
hierzu jeweils passende bindingsources und darunterliegende tables
die auswahltabelle ist dabei von der personentabelle geclont.

die personentabelle wird in der bindingsource über die gewählte gruppe gefiltert.

nun möchte ich verschiedene Personen aus verschiedenen Gruppen auswählen und in der auswahlliste speichern können. Dabei soll aber in der Listbox Name und Gruppe angezeigt werden (ich weiß, dass das mit nem Datagridview auch ginge, mir gefällt hierfür aber die Listbox eigentlich besser).

Meine Idee war nun die relevanten Datarows der Personen in Datarow_neu zu konvertieren und in die auswahlliste zu adden.


 auswahl.Rows.Add((DataRow_neu) ((DataRowView) bs_personen.Current).Row);

Leider habe ich mir das scheinbar zu einfach vorgestellt, denn es kommt zu einer InvalidCastException (DataRow kann nicht DataRow_neu umgewandelt werden).

Bin ich jetzt einfach auf dem Holzweg, oder lässt sich diese Umwandlung leicht bewerkstelligen.

Michael

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

die DataRow ist eben keine DataRow_neu. Daher kann sie auch nict ohne weiteres gecastet werden.

Du könntest Dir einen eigenen Konstruktor für DataRow_neu schreiben, der als Parameter eine DataRow bekommt.
Eine andere Möglichkeit wäre einen explicit operator zur Verfügung zu stellen, dann kannst Du auch casten. Dabei wird allerdings ebenfalls ein neues Objekt erzeugt - bzw dabei musst Du ebenfalls ein neues Objekt erzeugen

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
snmigerl Themenstarter:in
65 Beiträge seit 2006
vor 13 Jahren

hmmm...

und wie könnte sowas konkret aussehen?

ich laufe grade geistig gegen Wände... 8-(

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

ich gehe davon aus, daß Du weisst, was ein Konstruktor ist. Da müssen dann die Daten von einer übergebenen DataRow in die DataRow_neu kopiert werden, die gerade erzeugt wird.

Beim explicit operator läuft das ganz ähnlich, aber der sorgt dafür, daß man auch casten kann.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
snmigerl Themenstarter:in
65 Beiträge seit 2006
vor 13 Jahren

leider benötige ich im Konstruktor meiner datarow_neu einen "datarowbuilder", was auch immer der macht.

Den explicit operator müsste ich aber laut msdn

"Der Quelltyp stellt den Konvertierungsoperator bereit" bei DataRow einfügen, da komme ich aber nicht ran...

ich habe auch schon versucht einfach eine instanz von datarow_neu zu erzeugen udn dann das itemarray zu übergeben, aber ich kann keine instanz von datarwo_neu erzeugen, da der konstrukto den datrowbuilder braucht und der lässt sich wiederum ebenfalls nicht instanzieren...

irgendwie dreh ich mich im kreis

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Den explicit operator müsste ich aber laut msdn [...] bei DataRow einfügen, da komme ich aber nicht ran... Ja stimmt, das war der implicit den ich meinte, der geht in beide Richtungen.

Aber das löst immer noch nicht das Konstruktor-Problem.
Du müsstest dafür sorgen, daß von Haus aus Deine eigene Klasse für die Erzeugung der DataRows genutzt wird...

Ich denke hier über Vererbung zu gehen ist wahrscheinlich nicht wirklich ein gangbarer Weg. Zumindest kein einfacher.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

4.221 Beiträge seit 2005
vor 13 Jahren

Mach doch eine mehrspaltige ListBox

Habe selber vor längerem mal so was gebaut.

FileBrowser / Images in X Controls

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
snmigerl Themenstarter:in
65 Beiträge seit 2006
vor 13 Jahren

Also gut - ich habe es hinbekommen...

Nur um dann entnervt festzustellen, das es doch besser gewesen wäre ein Datagridview zu nehmen - was ich jetzt auch mache...

Trotzdem hier die Lösung:


public class DataTable_neu : DataTable
    {
        protected override Type GetRowType()
        {
            return typeof(DataRow_neu);
        }

        protected override DataRow  NewRowFromBuilder(DataRowBuilder builder)
        {
            
            return new DataRow_neu(builder);
 	        
        }

       



    }

    public class DataRow_neu:DataRow
    {
        public DataRow_neu(DataRowBuilder db) : base(db) { }


        public override string ToString()
        {
            string rueck = this.ItemArray[3].ToString() + " (" + this.ItemArray[2].ToString() + ")";

            return rueck;
        }



    }

und der Aufruf:

Teil1


            DataTable_neu auswahl = new DataTable_neu();

            foreach (DataColumn  col in personen.Columns)
            {
                auswahl.Columns.Add(col.ColumnName,col.DataType );
                
            }

Teil2:


 DataRow_neu nr = (DataRow_neu) auswahl.NewRow();
            
            nr.ItemArray=((DataRowView) bs_personen.Current).Row.ItemArray;
            auswahl.Rows.Add(nr);

Vielen Dank an alle die mir Tipps gegeben haben, aber mit einem dgv geht es deutlich einfacher...

Bei dem Weg den ich versucht habe handelt man sich nur einer Stolperfalle und einen Umweg nach dem anderen ein...

Aber trotzdem... Wieder was gelernt... 😉

5.299 Beiträge seit 2008
vor 13 Jahren

auch für List- und Combo -boxen braucht man das .Tostring() der Daten nicht zu überschreiben.
Du mußt nur den DisplayMember angeben, zB.

listBox1.DisplayMember="CustomerName";

und dann kannst du die Data-Tables und -Rows in Frieden lassen.

Aber DGV ist in der Tat vmtl. die bessere Wahl.

Der frühe Apfel fängt den Wurm.

S
snmigerl Themenstarter:in
65 Beiträge seit 2006
vor 13 Jahren

.DisplayName reicht leider nicht, da ich die Informationen aus 2 Spalten in einem angezeigten String kombinieren wollte:

Name (Gruppe)

Habs inzwischen wie gesagt doch auf DGV umgestellt...

F
10.010 Beiträge seit 2004
vor 13 Jahren

Wäre aber auch nicht nötig gewesen wenn du eine ExpressionColumn der DataTable hinzugefügt hättest.