C# - EventHandlers ... Bitte helft mir

kasal

Erfahrenes Mitglied
Hallo Freunde!

Habe folgendes Problem und zwar:
Es werden zur Laufzeit mehrere PictureBoxen dynamisch erstellt, so viele der User mag.

C#:
PictureBox pb = new PictureBox();
pb.Name = m_name; // Ein Name, der generiert wurde
pb.Width = 37;
pb.Height = 36;
pb.Image = imgImages.Images[0];
pb.Click += new System.EventHandler(this.PbClicked);
this.pnlPbs.Controls.Add(pb);

Mein problem ist nun der EventHandler, alle Pbs verwenden den selben. Wie kriege Ich es hin, dass beim clicken dem EventHandler noch der Name der PictureBox mitgegeben wird?


lg,
kasal
 
Mein problem ist nun der EventHandler, alle Pbs verwenden den selben. Wie kriege Ich es hin, dass beim clicken dem EventHandler noch der Name der PictureBox mitgegeben wird?

Der Name ist nicht immer der selbe?
dann kannst du einfach den Namen (als String) zusätzlich als Parameter übergeben...
oder die eventSource überprüfen... hab leider grade keine Entwicklungsumgebung zur Verfügung, aber kann dir morgen den Code posten :D

mfG
Leitman
 
Woah... jetzt bin ich aber erstaunt :-O
Kann man in C# von einem Object nicht den Namen erfahren?
Programmier normalerweise in managed C++ ;-)

Aber hab trotzdem ws gebastelt, vl kannst dus ja verwenden:
C#:
/*
 Hab mal zum Testen, einfach 2 Buttons und eine PictureBox erstellt,
 die alle bei einem Click dieselbe Methode aufrufen
*/
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(48, 32);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(48, 80);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 1;
            this.button2.Text = "button2";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button_Click);
            // 
            // pictureBox1
            // 
            this.pictureBox1.Location = new System.Drawing.Point(16, 208);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(100, 50);
            this.pictureBox1.TabIndex = 2;
            this.pictureBox1.TabStop = false;
            this.pictureBox1.Click += new System.EventHandler(this.button_Click);
//
// nun dir EventHandler:
//
        private void button_Click(object sender, EventArgs e)
        {
            // hier wollte ich eigentlich den Namen des senders überprüfen 
            // (in cpp: object->Name) aber das geht scheinbar nicht, 
            // aber sender.ToString gibt den Typ und anschließend den Namen aus! :)
            // mittelsSubstring schneide ich also 
            // "System.Windows.Forms.Button, Text: " weg 
            // und übrig bleibt dann nur mehr button1 / button2
            if (sender.ToString().Substring(35, 7) == "button1")
            {
                MessageBox.Show("B1 push");
            }
            else if (sender.ToString().Substring(35, 7) == "button2")
            {
                MessageBox.Show("B2 push");
            }
            else
            {
                MessageBox.Show("nope " + sender.ToString());
            }
        }

Sorry, dachte mich ich kann einfach die C++ Syntax und Methoden anwenden... dann ging das leichter, aber hoffe, das hat dir trotzdem etwas weitergeholfen :D

mfG
Leitman
 
Hmpf. Du erstaunst mich als Cpp'ler immer wieder leitman. *rennt* :D

Wie währe es mit casten? Schon vergessen? ;-]
C#:
void button_Click(object sender, EventArgs e) {
	string name =((Control) sender).Name;
	Button button = sender as Button;
	if ( button != null )
		name = button.Name;
	if( sender is typeof( Button ) )
		name =((Button) sender).Name;
}
 
Hallo Freunde!

Es klappt! Vielen Dank!

Ich habe ja jetz den Namen, fische mir das Control in der Collection raus.
Aber wenn ich seine Position verändern will, kommt dieser komische Fehler:

Compiler hat gesagt.:
Only assignment call, increment, decrement, and new object expressions can be used as a statement(CS0201)

Mein Code:

C#:
foreach(Control c in this.pnlRoom.Controls)
{
	if(c.Name == CurrentMachine)
	{
		Point p = PointToClient(MousePosition);
		c.Location.X == p.X;
		c.Location.Y == p.Y;
	}
}


lg,
kasal
 
Hallo Freunde!

Es klappt! Vielen Dank!

Ich habe ja jetz den Namen, fische mir das Control in der Collection raus.
Aber wenn ich seine Position verändern will, kommt dieser komische Fehler:



Mein Code:

C#:
foreach(Control c in this.pnlRoom.Controls)
{
	if(c.Name == CurrentMachine)
	{
		Point p = PointToClient(MousePosition);
		c.Location.X == p.X;
		c.Location.Y == p.Y;
	}
}
lg,
kasal

Wie die Fehlermeldung schon sagt, kann die Position nicht einfach so gesetzt werden. Sie muss direkt neu instanziert werden oder per (de)inkrement verändert werden.
C#:
ctrl.Location = new Point(10, 10);

C# == C++++
++++ == #
;)
Danke Cosmo, ich weiß ;) :p
 
Zurück