Laden...

Labels über 2 Dimensionales Array ansprechen

Erstellt von Lesat vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.687 Views
L
Lesat Themenstarter:in
2 Beiträge seit 2010
vor 13 Jahren
Labels über 2 Dimensionales Array ansprechen

Hi,

wollte mal wieder meine sowieso schon mikrigen c# Kenntnisse wieder auffrischen (mehr als 4 Jahre her wo ich was Programmiert hab). Dachte mir ich bau zu anfang ein Schachbrett. Aber nicht einfach 64 Labels malen sondern schön codemäßig erzeugen. Nach einem Tag intensiven Lesens und Googelns hab ich´s am Ende doch noch hinbekommen (jemand der sich auskennst schafft sowas wohl in 5mins).

Nun die Frage: Wie greife ich auf die einzelnen Labels zu? wahrscheinlich eher gar nicht. Daher hab ich überleg ich weiße einem Arrayfeld jeweils ein Label zu und kann die so abrufen um z.b. in naher Zukunft eine Schachfigur zu erstellen und die dann in die Stelle setzen wo ein gewisses Label ist (also die Location vom Label nehmen und dem Pferd z.b. geben). Das mit der Matrix war ursprünglich dazu gedacht die Labels in ein Array zu packen und darüber anzusprechen wenn ich was von denen will aber irgendwie komm ich da nicht auf nen grünen Zweig. Mir fehlt komplett der Ansatz und meine Lektüre hilft mir auch nicht weiter.

Hier der Code:

private void Form1_Load(object sender, EventArgs e)
{

String[,] matrix = new String[8, 8];
String stringx;
String stringy;
for (int y = 0; y < 8; ++y)
{
for (int x = 0; x < 8; ++x)
{
x++;
y++;
Label Label1 = new Label();
Label1.Location = new Point(x*60,y*60);
Label1.Size = new Size(60, 60);
stringx = x.ToString();
stringy = y.ToString();
x--;
y--;
matrix[y, x] = (stringx + stringy);
Label1.Text = matrix[y, x];

if (x % 2 == 0 && y % 2 == 0)
{
Label1.BackColor = Color.Black;
Label1.ForeColor = Color.White;
}

if (x % 2 == 1 && y % 2 == 0)
{
Label1.BackColor = Color.White;
Label1.ForeColor = Color.Black;
}

if (x % 2 == 1 && y % 2 == 1)
{
Label1.BackColor = Color.Black;
Label1.ForeColor = Color.White;
}

if (x % 2 == 0 && y % 2 == 1)
{
Label1.BackColor = Color.White;
Label1.ForeColor = Color.Black;
}

this.Controls.Add(Label1);

}
}




}

Danke für die Mühen.

Gruß Lesat

edit: Irgendwie hats mir beim Beitrag erstellen die Formatierung zerlegt, sorry hoffe es geht auch so.

916 Beiträge seit 2008
vor 13 Jahren

Hallo Lesat,

mein Tip zeichne das Schachbrett selber, und auch die Figuren. Das ist ertsens wesentlich performanter, und zweitens bist du so flexibler.

Again what learned...

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

siehe dazu [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox).

Bitte verwende die Code Tags für Code.

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

194 Beiträge seit 2006
vor 13 Jahren

Hallo Lesat

Einfach mal aus dem Stehgreif(ohne jegliche Garantie):



private void Form1_Load(object sender, EventArgs e)
{

String[,] matrix = new String[8, 8];
String stringx;
String stringy;
for (int y = 0; y < 8; ++y)
{
for (int x = 0; x < 8; ++x)
{
x++;
y++;
Label Label1 = new Label();
Label1.Location = new Point(x*60,y*60);
Label1.Size = new Size(60, 60);
stringx = x.ToString();
stringy = y.ToString();
x--;
y--;
matrix[y, x] = (stringx + stringy);

/*Hier*/ Label1.Name = Label1.Text = matrix[y, x];

if (x % 2 == 0 && y % 2 == 0)
{
Label1.BackColor = Color.Black;
Label1.ForeColor = Color.White;
}

if (x % 2 == 1 && y % 2 == 0)
{
Label1.BackColor = Color.White;
Label1.ForeColor = Color.Black;
}

if (x % 2 == 1 && y % 2 == 1)
{
Label1.BackColor = Color.Black;
Label1.ForeColor = Color.White;
}

if (x % 2 == 0 && y % 2 == 1)
{
Label1.BackColor = Color.White;
Label1.ForeColor = Color.Black;
}

this.Controls.Add(Label1);

}
}




}


void Suchen(string lName)
{
  foreach(Control c in this.Controls.Find(lName,false))
{
Label l = c as Label;
if(l!=null)
{
MessageBox.Show(l.Location.X.Tostring()+l.Location.Y.Tostring());
}
}
}

Gruss

Balaban_S

Edit: Code-Tags korrigiert

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo Balaban_S,

das ist eine eher schlechte Lösung da man die Controls suchen muss, wenn eine Lösung mit Labels gesucht ist, dann erstell doch einfach ein Label Array und greife normal über Indexer auf die einzelnen Labels zu.


Label[,] labelArray = new Label[8,8];
//---------------------------
//zugriff auf die Labels
labelArray[x,y].Text = "IrgendEinNeuerText";

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

194 Beiträge seit 2006
vor 13 Jahren

HAlo fz7090

das ist eine eher schlechte Lösung...

Ich finde die ganze Herangehensweise eigentlich eher "schlecht". Es ist einfach angefügt und nicht Neugecodet.

Was an sich stimmt ist jedoch, dass man mit Controls.Find() suchen muss
Das muss er auch da sich mit der Namensgebung wahrscheinlich so in der doppelten For-Schleife Überschneidungen ergeben werden., er könnte auch direkt via Controls[Controlname] zum gesuchten Ergebnis kommen.
Ich wollte eigentlich auch nur zeigen, dass diese Art der Beschriftung (bzw. Namensgebung) eher suboptimal ist und wollte es ihm nicht direkt vorkauen, da das Lernerlebnis ein Anderes ist wenn man selbst Fehler macht.

Gruss

Balaban_s

PS: Ich weiss ehrlich gesagt auch nicht, ob man 2 Controls überhaupt mit gleichen Namen versehen kann.

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

Das muss er auch da sich mit der Namensgebung wahrscheinlich so in der doppelten For-Schleife Überschneidungen ergeben werden.

Da es sich um ein 8x8 großes Feld handelt, kann es zu keiner Überschneidung kommen (erst wenn die Größe 2 stellig wird)

Ich wollte eigentlich auch nur zeigen, dass diese Art der Beschriftung (bzw. Namensgebung) eher suboptimal ist

Der Threadersteller hat den Labels keine Namen zugewiesen.

wollte es ihm nicht direkt vorkauen, da das Lernerlebnis ein Anderes ist wenn man selbst Fehler macht.

Aber eine schlechte Lösung zu zeigen, hat eher den gegenteiligen Effekt, sie funktioniert und der Fragesteller ist befriedigt. Er sucht nicht nach einer anderen vielleicht besseren Lösung, da er aus seiner Sicht ja keinen Fehler macht.

PS: Ich weiss ehrlich gesagt auch nicht, ob man 2 Controls überhaupt mit gleichen Namen versehen kann.

Ja das ist Möglich.

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

194 Beiträge seit 2006
vor 13 Jahren

Hallo

Der Threadersteller hat den Labels keine Namen zugewiesen.

Aber ich habe Ihm gezeigt wie nur mit dem Setzen einer Property auf das Control zugegriffen werden kann.

und zwar:


/*Hier*/ Label1.Name = Label1.Text = matrix[y, x];

Da es sich um ein 8x8 großes Feld handelt, kann es zu keiner Überschneidung kommen (erst wenn die Größe 2 stellig wird)

OK das stimmt.

Gruss

Balaban_s

L
Lesat Themenstarter:in
2 Beiträge seit 2010
vor 13 Jahren
  
Label[,] labelArray = new Label[8,8];  
//---------------------------  
//zugriff auf die Labels  
labelArray[x,y].Text = "IrgendEinNeuerText";  
  

Genau das hab ich schon Probiert aber aus irgendwelchen Gründen wollte er es nicht nehmen (hat mir die Suche in Google bereits gesagt). Ich finds momentan etwas merkwürdig das ich es immer genauso mache wie´s mir in div. Foren gezeigt oder wie hier geraten wird und am Ende funktionierts nicht. Freund von mir is schon etwas tiefer drin machts das schon mehrere Jahre beruflich der hat mir exakt die gleiche Lösung gezeigt und bei ihm hats funktioniert. Glaub ich sollte mich nomma auf die Theorie konzentrieren.

Danke an alle für die Antworten.

4.942 Beiträge seit 2008
vor 13 Jahren

Bedenke, daß mit


Label[,] labelArray = new Label[8,8];

nur das Array angelegt wird, aber noch nicht die Objekte dahinter.
Du mußt also erst noch die Zuweisung


labelArray[x, y] = new Label();

// bzw.
Label label = new Label();
...
labelArray[x, y] = label;

für jedes einzelne Label durchführen (innerhalb der x/y-Schleife).
Erst dann kannst du auf die einzelnen Eigenschaften und Methoden zugreifen (da Label bzw. jedes Control ein Referenztyp ist).