Hi,
Objekte - also auch DataSets - werden in C# ja soweit ich weiß per Referenz übergeben (genauer: die Referenz auf das Objekt wird als Wert übergeben).
Nun habe ich folgende Situation:
Ich habe eine Klasse, die eine Reihe von DataSets hält. Diese sind anfangs NULL.
Nun erzeuge ich aus dieser Klasse heraus Objekte anderer Klassen. Dabei übergebe ich eines der DataSets dem Konstruktor als Parameter. Ungefähr so:
private DataSet myDataSet;
public OtherClass MyMethod()
{
return new OtherClass(myDataSet);
}
In der Klasse OtherClass nehme ich also das DataSet entgegen und fülle es mit Daten aus einer Datenbank:
public class OtherClass
{
private DataSet myDataSet;
public OtherClass(DataSet paramDataSet)
{
myDataSet = paramDataSet;
// DataSet 'myDataSet' mit Daten befüllen
FillDataSet();
}
}
Funktioniert ja im Prinzip auch wunderbar. Nur leider ist myDataSet in der ersten Klasse danach immer noch NULL. Da nur die Referenz auf das DataSet übergeben wird, müsste doch myDataSet in beiden Klassen den gleichen Inhalt haben, weil sie beide auf das gleiche DataSet-Objekt zeigen, oder nicht?
Wo ist mein Denkfehler bzw. welche Lösungen gibt es?
Übrigens: Übergabe per ref oder out geht ja nicht, da ich in der Klasse OtherClass noch mehr Logik habe. ref und out würden ja bedeuten, dass ich am Ende des Konstruktors die geänderten DataSets für die Rückgabe fertig haben müsste...
Ich würde sagen du musst die Instanz eines Objektes übergeben. Eine Variable die null ist hat kein Speicher zugewiesen..., was soll denn da als Referenz übergeben werden?
Probier mal:
private DataSet myDataSet = new DataSet();
public OtherClass MyMethod()
{
return new OtherClass(myDataSet);
}
Ja, OK. Die Idee hatte ich auch schon, aber auch damit hat es nicht funktioniert 🙁
Das kommt mir sehr seltsam vor... oder/und ich hab ein Brett vorm Kopf 🤔
Seltsamerweise funktioniert der ganze Spaß, wenn ich das DataSet schon in der ersten Klasse befülle und das befüllte DataSet an die 2. Klasse übergebe. In der 2. Klasse (OtherClass im obigen Beispiel) kann ich dann auch neue Zeilen hinzufügen, ändern oder löschen - funktioniert alles wunderbar: Es wird auch in der ersten Klasse entsprechend geändert.
Warum funktioniert es nicht, wenn ich ein leeres DataSet übergebe (also nicht null, sondern new DataSet()) ? Selbst, wenn ich in das DataSet eine Tabelle packe (egal, ob die leer ist oder die Struktur der Datenbanktabelle besitzt), funktioniert es nicht.
Weiß denn niemand, was hier schief läuft?
Du müsstest nur das DataSet ref übergeben
public OtherClass(ref DataSet paramDataSet)
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
OK, Danke. Und wie dann weiter?
OtherClass soll sowas wie eine Liste darstellen (nach außen). Das DataSet ist dabei die Datenquelle.
Wenn ich nun also MyClass.MyProperty[5].Test eingebe, dann passiert intern folgendes:
MyClass hat ein Property mit dem sinnvollen Namen MyProperty:
public MyProperty
{
get { return new OtherClass(ref myDataSet); }
}
Hier hab ich das ref schon mal mit eingebaut. Hiermit wird also der Konstruktor von OtherClass aufgerufen.
OtherClass besitzt dann auch einen Indexer, mit dem ich auf die Zeilen des DataSets zugreifen kann. Der Indexer gibt mir dann ein Objekt der Klasse ThirdClass zurück, welche ebenfalls das DataSet als Parameter erhält:
public this[int index]
{
return new ThirdClass(myDataSet, index);
}
ThirdClass wiederum greift dann auf die ihr übergebene Zeile des DataSets zu und gibt durch ihre Properties die Zellen/Spalten der Zeile im DataSet zurück.
Das funktioniert wie schon gesagt auch alles. Dur wenn ich über die ebenfalls in der Klasse OtherClass bereitgestellten Methoden Add(), Remove() etc. das DataSet verändere, ändert es sich nicht in MyClass, wo es eigentlich gehalten werden soll.
Wenn ich dann also wie von Dir vorgeschlagen im Konstruktor ref verwende, gringt mir das also was? Am Ende des Konstruktors ist mit dem DataSet doch noch nichts passiert?!