Forum: PC-Programmierung C# Wieso hat das Array außerhalb der Methode nur noch den letzten Wert?


von Jonas N. (medustv)


Lesenswert?

Declariert ist das Array (idArray) außerhalb der Methode als public 
allerdings sind außerhalb des whiles alle werte bis auf den letzten weg 
und innerhalb des Whiles kann ich auf alle zugreifen kann mir jemand 
erklären was da passiert?
1
else if (selectet == 2)
2
            {
3
                string constring = "datasource=localhost;port=3306;username=readdisk;password=guju1guju1";
4
                string Query = "SELECT PK_case FROM smartcontrol.cases WHERE casename ='" + gehäusetyp + "';";
5
                MySqlConnection conDataBase = new MySqlConnection(constring);
6
                MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase);
7
                MySqlDataReader myReader;
8
                try
9
                {
10
                    conDataBase.Open();
11
                    myReader = cmdDataBase.ExecuteReader();
12
                    
13
14
                    while (myReader.Read())
15
                    {
16
                        string intCaseId = myReader.GetString(0);
17
18
                        //array einthält außerhalb der while methode nur noch den letzten zugewiesenen wert..    WARUM!!!!!!!!!!!!!!!
19
                        idArray = new int[] { Convert.ToInt32(intCaseId) };
20
                    }
21
                    conDataBase.Close();
22
23
                    foreach (int ids in idArray)
24
                    {
25
                        MessageBox.Show(Convert.ToString(ids));
26
                    }

: Bearbeitet durch User
von C2X (Gast)


Lesenswert?

Ich bin keine C# Profi.

Aber mit dieser Zeile legt du immer wieder ein Array an das nur den 
letzten konvertierten Wert enthält.
 idArray = new int[] { Convert.ToInt32(intCaseId)

Du muss den Wert an das Array appenden. Wie und wo ist denn idArray 
definiert.

von Jonas N. (medustv)


Lesenswert?

Kennst du eine seite wo ich den gesmaten code posten kann wo er auch 
vernüftig dargestellt wird?

von Udo S. (urschmitt)


Lesenswert?

Jonas N. schrieb:
> Kennst du eine seite wo ich den gesmaten code posten kann wo er auch
> vernüftig dargestellt wird?

Kannst du Lesen?

In dem Fenster in dem du hier einen beitrag schreibst steht DICK UND 
FETT:

Antwort schreiben
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Formatierung (mehr Informationen...)
1
C-Code
1
Code in anderen Sprachen, ASCII-Zeichnungen

  

von Udo S. (urschmitt)


Lesenswert?

Nochwas:
es erleichtert ungemein, wenn man
1. Ein compilier und ausführbares Beispiel einstellt
2. Das Beispiel auf das Problem reduziert und alle unnötigen Codeteile 
entfernt.

von Jonas N. (medustv)


Angehängte Dateien:

Lesenswert?

So dann hier einmal den gesamten Code.

von Udo S. (urschmitt)


Lesenswert?

Ich kenne mich mit C# nicht aus, aber ich sehe nirgends dass da ein 
Array mit mehreren Elementen angelegt wird.
Statt dessen wird (wenn ich das richtig verstehe) mehrfach ein Array mit 
einem Element erzeugt und überschreibt dann das vorherige
1
int[] idArray;
2
...
3
while (myReader.Read()) {
4
  idArray = new int[] { Convert.ToInt32(intCaseId) };
5
}

Wie gesagt kenne C# nicht wirklich, aber schau mal nach einer 
"ArrayListe" oder ähnlich in die du dann dynamisch Elemente dazupacken 
kannst.

: Bearbeitet durch User
von Achim H. (anymouse)


Lesenswert?

C2X schrieb:
> Aber mit dieser Zeile legt du immer wieder ein Array an das nur den
> letzten konvertierten Wert enthält.
>  idArray = new int[] { Convert.ToInt32(intCaseId)

ist die richtige Antwort.

Der Variablen idArray wird immer neu ein Array zugewiesen, welches nur 
einen Wert enthält.


Lösung:

C2X schrieb:
> Du muss den Wert an das Array appenden.

Oder besser: Statt eines (einmal mit einer bestimmten Länge 
initialisierten) Arrays eine dynamisch veränderbare Liste verwenden.

https://stackoverflow.com/questions/202813/adding-values-to-a-c-sharp-array

von Udo S. (urschmitt)


Lesenswert?


von Jonas N. (medustv)


Lesenswert?

Okay Dankeschön für eure Hilfe ihr habt mir sehr weiter geholfen ich 
programmiere noch nicht so lange und wusste nicht das es sowas wie Array 
listen gibt.

von Udo S. (urschmitt)


Lesenswert?

Jonas N. schrieb:
> ich
> programmiere noch nicht so lange und wusste nicht das es sowas wie Array
> listen gibt.

Wir haben alle mal angefangen :-)

Das ist einer der großen Stärken von Sprachen wie C++, C# oder Java.
Schau dir das Collections Framework an. Da gibt es Listen, Arrays, Sets, 
Maps usw. usf.
Das was man früher mühsam selbst entwickeln musste hat man hier fertig 
als zueinander passende Klassen und Interfaces.

: Bearbeitet durch User
von Jonas N. (medustv)


Angehängte Dateien:

Lesenswert?

Habe meinen Code jetzt mal überarbeitet und aus dem Array "idArray" eine 
ArrayListe gemacht jetzt ist das komische das mein Listview nur den 
erste und letzten wert ausgibt. Das Listview bekommt seinen inhalt aus 
der liste "items". Diesen fehler kann ich mir noch weniger erklären was 
passiert denn mit den werten dazwischen?

Kann es sein das der erste Eintrag noch ganz normal eingetragen wird und 
der Rest sich immer wieder überschreibt weshalb nur der erste und letzte 
ausgegeben wird?

: Bearbeitet durch User
von Udo S. (urschmitt)


Lesenswert?

Wie oft wird denn ein Wert zu der ArrayList dazugeschrieben.
Du benutzt nur die Methode add(). Die sollte eigentlich immer nur ein 
neues Element hinzufügen.

von Jonas N. (medustv)


Lesenswert?

Bis jetzt bekommt items eigentlich 3 werte zugefügt ausgegebn werden nur 
2 und der in der Mitte bleibt weg.

von nicht"Gast" (Gast)


Lesenswert?

Huhu,

bitte nicht an ArrayList gewöhnen. Nimm lieber List<> statt dessen.

Das Problem an der Sache ist, dass du in ArrayList über boxing und 
unboxing (bitte nachlesen) alles drin speichern kannst. Damit umgehst du 
das Typsystem und selbst MS emfpiehlt das nicht mehr.

https://docs.microsoft.com/de-de/dotnet/api/system.collections.arraylist?view=net-5.0


Was mit noch wichtig ist, ist dein Exceptionhandling.

mach das nicht. zum einen willst du immer die gleiche Exception fangen. 
Da kannst du dir die mehrfachen try/catch geschichten auch sparen und 
nur einen machen.

Wenn man mehrere try/catch in einer Funktion/Methode braucht, ist sie 
sowieso zu lang und macht zu viele Sachen auf einmal.

Dazu kommt noch, dass du mit dem Message String prüfst, welche Exception 
du hast. Lass das lieber sein. Du kannst auch deine gesuchte Exception 
direkt fangen und danach die nächste (oder auch nicht)

1
void foo(){
2
   try{
3
       int x = 5/0;
4
   }
5
   catch(DivideByZeroException excp){
6
       Console.WriteLine("irgend ein depp hat durch 0 dividiert");
7
       throw;
8
   }
9
   catch(Exception excp){
10
       Console.WriteLine("etwas anderes schlimmes ist passiert");
11
       throw;
12
   }
13
}

Der code oben fängt die Exception ab, die durch die Division entsteht 
und wenn noch eine andere Exception auftritt, wird die im zweiten catch 
gefangen. Das kannst du beliebig Erweitern, also beliebig viele 
unterschiedliche Exceptions mit catch einfangen.

von Jonas N. (medustv)


Lesenswert?

Okay Dankeschön für deine tipps

von Test (Gast)


Lesenswert?

public int[] idArray  { get; set; }

Versuche dies

von Kalender Kalender (Gast)


Lesenswert?

Test schrieb:
> Versuche dies

Kaum ist ein Jahr verstrichen - schon weisst du eine Lösung.

von Jonas N. (medustv)


Lesenswert?

Ja, es freut mich sehr endlich eine Lösung gefunden zu haben, jetzt kann 
ich nachts endlich wieder in Ruhe schlafen.

von Test (Gast)


Lesenswert?

Der Fehler liegt dort

  idArray = new int[] {Convert.ToInt32(intCaseId)};
             ^
Das Array wird neu erstellt

idArray = MergeArray(idArray,new int[] {Convert.ToInt32(intCaseId)});

Allgemeine Methode zum Mergen zweier Arrays von gleichen Daten Typs

public  T[] MergeArray<T>(T[] ArrayOne, T[] ArrayTwo)
{
     T[] combined = ArrayOne.Concat(ArrayTwo).ToArray();
     return combined;
}

von Zeno (Gast)


Lesenswert?

Wie schon viele Vorredner geschrieben haben, erzeugst Du bei jedem 
Durchlauf der while Schleife das Array neu und füllst es mit genau einem 
Wert.
Da Du ein globales Array benutzt mußt Du in der Schleife prüfen ob das 
Array existiert. Das sollte über die Abfrage
1
idArray == NULL
 gehen. Wenn es NULL ist muß es erzeugt werden, ansonsten muß dem Array 
eine neue Länge zugewiesen werden. Das geht mit
1
Array.Resize(ref idArr, idArr.Length+1);
2
idArray[idArr.Length-1]=DeinWert;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.