Entwickler-Ecke

Basistechnologien - Problem mit ListView Add


-CrimeTime- - So 21.11.10 22:15
Titel: Problem mit ListView Add
Hallo,
ich habe das Problem das meine Funktion statisch ist und ich leider nicht weiss wie ich die listView1 statisch mache, dazu kommt noch das Problem das ich zwei verschiedene Werte habe "String, Int"

hier mein bisheriger Code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
                int[] myItems = new int[] 
     
                {
                    GetName(i), // das ist ein String
                    GetCount(i),
                    GetLevel(i),
                    GetMinBid(i),
                    GetMinIncrement(i),
                    GetBuyoutPrice(i),
                    GetBidAmmount(i),
                    GetOwner(i) // das ist ein String
                };
                ListViewItem lvi = new ListViewItem(myItems);
                listView1.Items.Add(lvi); //listView1 ist rot Markiert weil es nicht Statisch ist!


jaenicke - So 21.11.10 22:20

Umgekehrt, du musst nicht die ListView unabhängig von einer Objektinstanz (statisch eben) machen, sondern auf die konkrete ListView einer konkreten Formularinstanz zugreifen.

Du musst also die Variable, in der dein Formular liegt, benutzen.


-CrimeTime- - So 21.11.10 22:21

das ist ja die listView1, oder habe ich das nun Falsch verstanden?

Edit:
so sieht der Fehler aus:
An object reference is required for the non-static field, method, or property 'Project1.frm1.listView1'


Yogu - So 21.11.10 22:31

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du musst also die Variable, in der dein Formular liegt, benutzen.

Vor allem muss erstmal eine Variable für das Formular existieren.

Du musst dir das ganze so vorstellen: Form1 ist eine Klasse, die allgemein beschreibt, wie solche Formulare aussehen und sich verhalten sollen. Und das Ding, was du siehst, ist eine Instanz dieser Klasse. Es könnte noch viele weitere Instanzen von Form1 geben.

Das heißt, es ist nicht ganz eindeutig, welches Formular du meinst, wenn du die Instanz selbst nicht kennst. Woher soll deine statische Methode denn wissen, welche sie verwenden soll? Also musst du in einer statischen Variable die Referenz auf die Forminstanz festhalten. Zum Beispiel könnte man das zuerst erstellte Formular verwenden. Dafür musst du im Konstruktor prüfen, ob die Variable schon gesetzt wurde, und wenn nicht, sie mit this füllen.

Wenn irgendein Wort unklar ist, bitte Fragen :)


-CrimeTime- - So 21.11.10 22:34

ha wenn blos eins wort davon für mich klar gewesen wäre :D
also ich denke du meinst die Definition aus der .Designer.cs (private System.Windows.Forms.ListView listView1;)
aber wenn ich diese Static mache, bekomme ich ein haufen von Fehler.

Edit: was auch noch glaube Interessant zu Wissen ist, das sich dieser Code der oben im ersten Post sich in der From befindet wo auch die listView1 ist.


Kha - So 21.11.10 23:32

Dann hast du die Methode, die den Code enthält, anscheinend als static markiert. Und das macht keinen Sinn, mach's weg ;) .


-CrimeTime- - So 21.11.10 23:40

kann ich nicht weg machen das gibt über 20 Fehlermeldungen.
hier die Function Definition.

Quelltext
1:
public static List<Item> GetList()                    


Yogu - So 21.11.10 23:52

Um die Begrifflichkeiten nochmal zu klären: Klassen kannst du in C# mit dem Schlüsselwort class deklarieren. Sie enthalten Eigenschaften, Methoden usw. Von einer Klasse kann man eine Instanz erstellen, das ist dann ein Objekt (man kann die beiden Begriffe eigentlich synonym verwenden). Eine Klasse wäre z.B. ein Stempel, die Instanzen wären Abdrücke, die man mit ihm erstellen kann.

Eine Referenz ist vereinfacht gesagt eine Variable, über die man auf ein Objekt zugreifen kann.

Um zurück zum Thema zu kommen:

Soll die Methode überhaupt statisch sein? Das entscheidet man eigentlich nicht darüber, welche Option wie viele Fehler verursacht, sondern indem man überlegt, was sinnvoll ist:


In einer Formularklasse sind normalerweise die meisten Methoden nicht statisch, da sie meistens direkt auf das Formular zugreifen müssen.

Was macht denn die Methode GetList eigentlich?

Ich schätze, von den 20 Fehlermeldungen bedeuten einige, dass auf die Methode zugegriffen wurde, ohne ein Objekt anzugeben. Das lässt sich recht einfach beheben: Stelle jedem, der auf die Methode zugreifen muss, eine Referenz auf das Formular (via this) bereit.


-CrimeTime- - Mo 22.11.10 00:00

danke für die Detailreiche Aufklärung Yogu, die hatte ich mal nötig g*

also die Funktion ist nun so:

Quelltext
1:
public List<Item> GetList()                    


scheint alles gut zu laufen bis auf dieser Fehler:
Argument 1: cannot convert from 'int[]' to 'System.Windows.Forms.ListViewGroup'

in dieser Code Zeile:

Quelltext
1:
ListViewItem lvi = new ListViewItem(myItemsInt); // alles nach dem = ist unterstrichen.                    


ich denke das Problem ist weiterhin, das den text bzw. die Zahlen die ich in der ListView darstellen will Int und String sind.
gibt es sowas wie eine Vollständige verweisung wo er den Text oder die Zahl reinpacken soll?

z.B.

Quelltext
1:
2:
listView1.ItemGetName.Add(GetName(i)) // für den String
listView1.ItemGetCount.Add(GetCount(i)) // für den Int Wert


weil dann würde ich auch das Problem mit der int liste umgehen(siehe erster post)

Edit:
Zitat:
Was macht denn die Methode GetList eigentlich?

also GetList ist dafür zuständing die Daten zusammeln die in die ListView kommen bzw. Angezeigt werden sollten.


Yogu - Mo 22.11.10 00:06

user profile icon-CrimeTime- hat folgendes geschrieben Zum zitierten Posting springen:
ich denke das Problem ist weiterhin, das den text bzw. die Zahlen die ich in der ListView darstellen will Int und String sind.

Denk ich auch. Du musst also irgendwie alle Einträge in strings umwandeln:


C#-Quelltext
1:
2:
3:
string[] stringValues = new string[myItemsInt.Length];
for (int i = 0; i < stringValues.Length; i++)
  stringValues[i] = myItemsInt[i].ToString();



user profile icon-CrimeTime- hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Was macht denn die Methode GetList eigentlich?

also GetList ist dafür zuständ die Daten zusammeln die in die ListView kommen.

Hört sich stark nach nicht-statischer Methode an.

Edit: Fehler im Code behoben (siehe Hervorhebung)


-CrimeTime- - Mo 22.11.10 00:15

also irgendwas mache ich Falsch mit deinem Code.

hier wie ich ihn Benutze:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
                int[] myItemsInt = new int[] 
     
                {
                    GetName(i), //rot unterstrichen Fehelermeldung: Cannot implicitly convert type 'string' to 'int'
                    GetCount(i),
                    GetLevel(i),
                    GetMinBid(i),
                    GetMinIncrement(i),
                    GetBuyoutPrice(i),
                    GetBidAmmount(i),
                    GetOwner(i) //rot unterstrichen Fehelermeldung: Cannot implicitly convert type 'string' to 'int'
                };

                string[] stringValues = new string[myItemsInt.Length];
                for (int u = 0; u < stringValues.Length; i++)
                    stringValues[i] = myItemsInt[u]; //myItemsInt rot unterstrichen mit dieser Fehlermeldung:Cannot implicitly convert type 'int' to 'string'


jaenicke - Mo 22.11.10 00:17

Schau dir zur Umwandlung einmal TryParse an. ;-)
http://msdn.microsoft.com/en-us/library/system.int32.tryparse.aspx


Yogu - Mo 22.11.10 00:20

Erstmal muss ich mich entschuldigen; ich habe in aller Eile den wichtigsten Teil meines Codes vergessen: ToString().

Allerdings ist das alles doch gar nicht nötig! Die Fehlermeldungen gibt es nur deshalb, weil du versuchst, Strings in einem Integer-Array (myItemsInt) zu speichern. Warum erstellst du dann überhaupt ein Integer-Array? Wenn du myItemsInt nicht als int[], sondern als string deklarierst, kannst du das dem Konstruktor von ListViewItem direkt übergeben. Natürlich müssen dann aber die ganzen Integer-Werte in Strings umgewandelt werden. Das kannst du ganz einfach mit der Methode ToString machen.


-CrimeTime- - Mo 22.11.10 00:24

Also wenn ich es so mache:


Quelltext
1:
GetCount(i).ToString,                    


erhalte ich diese Fehlermeldung: Cannot convert method group 'ToString' to non-delegate type 'string'. Did you intend to invoke the method?


Yogu - Mo 22.11.10 00:28

Du hast die Klammern vergessen ;)


-CrimeTime- - Mo 22.11.10 00:50

danke Funktioniert 1A, habe aber da noch eine Frage, ich lese ja mit dem Wert GetMinBid(i) eine Zahl aus, diese ist 4 ställig kann ich das was ich dort erhalte abtrennen? z.b. das die zahl nicht 3089 ist sonder 30 89?