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
Hallo,
geht es dir nur um ToString()?
Was hast du vor? Vielleicht ist ja IFormattable was für dich!
mfg
serial
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
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
hmmm...
und wie könnte sowas konkret aussehen?
ich laufe grade geistig gegen Wände... 8-(
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
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
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
Mach doch eine mehrspaltige ListBox
Habe selber vor längerem mal so was gebaut.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
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... 😉
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.
.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...
Wäre aber auch nicht nötig gewesen wenn du eine ExpressionColumn der DataTable hinzugefügt hättest.