Entwickler-Ecke
C# - Die Sprache - Einzelner Wert in System.Array einlesen?
Help_Me - Do 29.04.10 22:49
Titel: Einzelner Wert in System.Array einlesen?
Hallo!
Ich habe eine Methode, die auf einen Excel-Bereich zugreift und mir diese Zellen zurück liefert.
Diese Werte lese ich dann in ein System.Array ein und gebe es zurück, bzw. möchte es zurück geben.
Das Problem ist, dass ich den Excel-Bereich nur bekomme, wenn mehr als eine Zelle selektiert ist. Ist dies nicht der Fall, bekomme ich null zurück. Wenn ich null bekomme, dann greife ich nur noch auf eine einzelne Zelle zu, die mir dann im Normalfall ein Objekt vom Typ Double oder String liefert.
Nun habe ich aber das Problem, dass ich in meiner Methode ja eigentlich ein System.Array zurückgeben möchte.
Einlesen kann ich mein Objekt in dieses Array leider nicht, da bekomme ich die Meldung, dass das Objekt nicht in den Typ System.Array umgewandelt werden kann.
Gibts da vielleicht doch eine Möglichkeit?
Grüße
Greenberet - Do 29.04.10 22:56
erstell doch einfach ein array von der größe 1 und gib das element dann an die 0te stelle im array
dann das array noch zurückgeben und fertig
Help_Me - Mo 03.05.10 22:44
Hi!
So hatte ich es jetzt auch erst einmal gemacht. Nur wurde mir jetzt gesagt,
ich solls versuchen anders zu lösen.
Ich soll nachher die Möglichkeit haben, mit array.getUpperBound(1) darauf
zugreifen zu können. Nur ist mir so rein gar nicht klar, wie das gehen soll, denn
wenn ich ein Array mit nur einem Element hab, kann ich die oben genannte Methode nicht verwenden.
Wäre es eventuell sinnvoll, dann etwas anderes als ein System.Array zurückzuliefern?
Oder habt ihr ne andere Idee??
Gruß
Help_Me - Di 04.05.10 14:57
Hi!
Bin noch immer bei meinem alten Problem.
Was mich an diesem Codestück wundert und was ich gerne anders hätte:
Wenn ich einen einzelnen Wert einlese, greife ich auf ihn später
mit
array.GetValue(i,j) zu. i und j sind jeweils 1.
Habe ich allerdings mehrere Werte, so beginnt der erste Wert
nicht bei [0,0], sondern bei [1,1]. Das verursacht mir im
weiteren Verlauf des Programms leider ziemliche Probleme.
Ist es nicht möglich, sowohl beim ersten als auch beim zweiten Array,
den ersten Wert (das erste Array hat ja nur einen) bei [0,0] einzufügen?
Oder gerne auch beide bei [1,1]...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public object[,] Range(Application xlApp) { Excel.Range myRange = (Range)xlApp.ActiveWindow.RangeSelection; object[,] array; if (myRange.Cells.Count == 1) { object wert = myRange.Value; array = new object[1, 1]; array[0,0] = wert; } else { array = (object[,])myRange.Value; } return array; } |
Kha - Di 04.05.10 18:28
Wenn du wie Excel ein (1,1)-basiertes Array erstellen willst, darfst du nicht über
new object[...] gehen, sondern über
Array.CreateInstance:
Zitat: |
Creates a multidimensional Array of the specified Type and dimension lengths, with the specified lower bounds. |
Help_Me - Di 04.05.10 21:19
C#-Quelltext
1: 2: 3: 4:
| object wert = myRange.Value2; Array array = Array.CreateInstance(typeof(object), 1, 1); array.SetValue(wert, 0, 0); return array; |
Meinst du das so, bzw. so ähnlich? Weil hier handelt es sich ja wieder um ein (0,0)-basiertes Array.
Kha - Di 04.05.10 21:23
Ganz genau, deswegen stammt der von mir zitierte Text wahrscheinlich aus einer anderen Überladung der Methode :zwinker: .
Help_Me - Mi 05.05.10 06:28
C#-Quelltext
1: 2: 3: 4: 5: 6:
| int [] lengths = new int[]{1,1}; int[] lowerbounds = new int[] { 1, 1 }; object wert = myRange.Value2; Array array = Array.CreateInstance(typeof(object), lengths, lowerbounds); array.SetValue(wert, 1, 1); return array; |
:)
Help_Me - Mi 05.05.10 21:15
So, wie unten zu sehen, schaut mein Code jetzt aus. Allerdings wurde mir gesagt, ich solle die Prüfung, ob es sich
um einen Range handelt, der nur eine Zelle beinhaltet weglassen.
Jetzt steh ich wieder am Anfang.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| public object[,] Range(Application xlApp) { Excel.Range myRange = (Range)xlApp.ActiveWindow.RangeSelection; objcet [,] array; if (myRange.Cells.Count == 1) { int [] lengths = new int[]{1,1}; int[] lowerbounds = new int[] { 1, 1 }; object wert = myRange.Value2; array = Array.CreateInstance(typeof(object), lengths, lowerbounds); array.SetValue(wert, 1, 1); return array; } else { array = (object[,])myRange.Value2; }
return array; } |
Wenn ich keine Abfrage mache, welche prüft ob es sich um eine Zelle oder mehr handelt, dann habe ich hier:
array = (object[,])myRange.Value2; wieder das Problem, dass ein einzelner Wert nicht in ein Array eingelesen werden kann.
Noch Tipps? =/
Kha - Mi 05.05.10 22:17
Help_Me hat folgendes geschrieben : |
Allerdings wurde mir gesagt, ich solle die Prüfung, ob es sich um einen Range handelt, der nur eine Zelle beinhaltet weglassen. |
Da die Eigenschaft nun einmal nach genau diesem Kriterium den einen oder den anderen Datentyp anzunehmen scheint, ist die Forderung schwer erfüllbar. Je nachdem, wie die Daten schließlich verarbeitet werden, könnte man vielleicht auf das Erstellen des Arrays verzichten und direkt mit
if (value is object[,]) else ... zugreifen, aber im Grunde ist das die gleiche Prüfung.
Help_Me - Do 06.05.10 16:55
Okay, da gabs wohl ein Missverständnis.
Hab das heute nochmal geklärt und das ist so in Ordnung.
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!