C# Button, Array, Gruppe, Dynamisch erzeugen

Blackhawk50000

Erfahrenes Mitglied
Hallo,

sorry für den schlechten Titel, aber ich wusste nicht genau welches Thema ich meinem Problem oder meinem Anliegen geben sollte.

Meine Idee ist die: Ich habe eine sich ständig verändernde Form mit vielen Buttons. Diese Buttons sind je nach Benutzer anders als standard. Der Benutzer selber soll aber per ToolStripeMenü wählen können welche ButtonGruppe er nimmt.

Nun habe ich mir überlegt ein Array mit den ganzen Buttons zu erstellen.... aber die Buttons noch nicht auf die Form zu bringen.

Wenn der Benutzer sich angemeldet hat, erscheinen die Buttons aus dem Array automatisch.

Die Buttons sind, das muss ich dazu sagen, alle symetrisch angeordnet.

Ich habe mir überlegt das ganze mit einer foreatch Schleife aus dem Array zu lesen und dann die Koordinaten zu erhöhen um andere positionen zu bekommen.


Button[] m<ButtonArray = new Button[120]

Das soll mein Array sein. Nur ist die Frage, wie erzeuge ich die Buttons so, dass es alles unterschiedliche Buttons sind....sie sollen ALLE das selbe click_event haben, aber die Buttons sollen dennoch unterschiedlich sein....

Wenn ich nun beim Zeichnen der Buttons eine forlaufende Numerierung durchführe soll, wenn ich auf den Button 5 klicke, das selbe Event wie bei alles anderen behandelt werden.

Im Event steht

MessageBox.show ("Button" + Button.Text)
(der text des Buttons ist die nummerierung)

in der Messagebox soll dann also stehen "Button 5"
und bei Button 7 soll "Button 7" da stehen.


Wenn ihr mir hier helfen könnten, wäre ich euch erst mal sehr dankbar.

gruß Blackhawk50000
 
So ein Standard-Eventhandler hat einen Parameter "sender". Mit dem kannst du rausfinden, welcher Button angeklickt wurde:

Code:
MessageBox.Show("Button " + ((Button)sender).Text);

aber die Buttons sollen dennoch unterschiedlich sein....
Was heißt das konkret?
 
naja es soll jeder für sich ein eigenstnder button sein, ich soll ich per code auch nach beliben entfernen können....

aber was meine frage ist, wie bekomme ich ich die butten denn nun in so ein array und wie lese ich das dann aus und erleuge die button?
 
Ich hoffe, es macht dir nix, dass ich VB.Net benutzt hab, sonst halt sagen:
Code:
Public Class Form1
    Dim Buttons(10) As Button

    Sub ButtonsErzeugen()
        For i = 0 To Buttons.Length - 1
            Buttons(i) = New Button()
            Buttons(i).Text = "Button " & (i + 1)
            Buttons(i).Top = (i + 1) * 30
            Buttons(i).Left = 30

            AddHandler Buttons(i).Click, AddressOf Handler
        Next
    End Sub

    Sub Handler(ByVal sender As Object, ByVal e As EventArgs)
        MessageBox.Show(DirectCast(sender, Button).Text & " angeklickt!")
    End Sub

    Sub ButtonsAnzeigen()
        Me.Controls.AddRange(Buttons)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ButtonsErzeugen()
        ButtonsAnzeigen()
    End Sub
End Class
 
PHP:
view plain sourcecopy to clipboard
public class Form1 
{ 
    Button[] Buttons = new Button[11]; 
    
    public void ButtonsErzeugen() 
    { 
        for (i = 0; i <= Buttons.Length - 1; i++) { 
            Buttons(i) = new Button(); 
            Buttons(i).Text = "Button " + (i + 1); 
            Buttons(i).Top = (i + 1) * 30; 
            Buttons(i).Left = 30; 
            
            Buttons(i).Click += Handler; 
        } 
    } 
    
    public void Handler(object sender, EventArgs e) 
    { 
        MessageBox.Show(((Button)sender).Text + " angeklickt!"); 
    } 
    
    public void ButtonsAnzeigen() 
    { 
        this.Controls.AddRange(Buttons); 
    } 
    
    private void Form1_Load(object sender, System.EventArgs e) 
    { 
        ButtonsErzeugen(); 
        ButtonsAnzeigen(); 
    } 
}
 
Nimm ein Panel als Parent Control.

Erzeuge deine Buttons und weise einfach die Eigenschaft Dock mit DockStyle.Top zu dann musst du die Koordinaten nicht selbst ermitteln.

Und dazu beim Panel selbst dann noch AutoScroll auf true, dann hast du ne Scrollbar falls deine Buttons über den Bereich des Panels hinaus gehen.
 
Ich habe das AutoSize auf treu gesetzt, das geht auch und ist genau das was ich wollte. ich habe jetzt 100 Buttons, die im 10 x 10 quadtrat angeordnet sind.

aber irgendwie komm ich nicht auf den nächsten schritt.....wir bekomm ich es zum beispiel hin, dass wenn ich den button 100 anklicke, sich der button 1 rot färbt?
 
Code:
public void Handler(object sender, EventArgs e) 
    { 
        if(sender == Button[7])
            Button[1].BackColor = Color.Red;
    }
Wenn der Sender Button 7 ist dann setzte die Hintergrundfarbe von Button 1 auf Rot.
 
ja genau so habe ich mir da auch gedacht, hatte auch funktioniert.... und das ganze ist jetzt sogar recht dynamisch =)

jetzt noch ein problem, wie bekomm ich es hin, dass die buttons in einem Panel sind.... so das das menueTripe die buttons an der oberseite nicht verdenkt.....
 
du fügst einfach den Button der ControlCollection des Panels hinzu:
C#:
meinPanel.Controls.Add(Buttons(i));
oder alternativ die Eigenschaft Parent des Buttons setzen
C#:
Buttons(i).Parent=meinPanel
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück