Autor Beitrag
Help_Me
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 29.04.10 22:49 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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]...

ausblenden 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[11];
        array[0,0] = wert;               
    }
    else
    {
        array = (object[,])myRange.Value;
    }
    return array;
}
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 04.05.10 21:19 
ausblenden C#-Quelltext
1:
2:
3:
4:
object wert = myRange.Value2;
Array array = Array.CreateInstance(typeof(object), 11);
array.SetValue(wert, 00);
return array;

Meinst du das so, bzw. so ähnlich? Weil hier handelt es sich ja wieder um ein (0,0)-basiertes Array.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 05.05.10 06:28 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
int [] lengths = new int[]{1,1};
int[] lowerbounds = new int[] { 11 };
object wert = myRange.Value2;
Array array = Array.CreateInstance(typeof(object), lengths, lowerbounds);
array.SetValue(wert, 11);
return array;

:)
Help_Me Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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.

ausblenden 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[] { 11 };
           object wert = myRange.Value2;
           array = Array.CreateInstance(typeof(object), lengths, lowerbounds);
           array.SetValue(wert, 11);
           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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 05.05.10 22:17 
user profile iconHelp_Me hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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!