Laden...

Buttons mit for schleife erstellen

Erstellt von CamelxDD vor 13 Jahren Letzter Beitrag vor 13 Jahren 7.516 Views
C
CamelxDD Themenstarter:in
16 Beiträge seit 2010
vor 13 Jahren
Buttons mit for schleife erstellen

Huhu,
Ich versuche mich gerade daran mit einer for schleife 3x3 buttons zu erstellen und auf eine Form zu bringen. Jedoch will es partout nicht funktionieren.
Kann mir bitte einer sagen warum?
Hier ist mein code:

    partial class Miner
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>

        public void InitializeComponent()
        {

            for (int i = 0; i <= 9; i++)
            {

                this.buttons[i] = new System.Windows.Forms.Button();
                this.SuspendLayout();

                this.buttons[i].Location = new System.Drawing.Point(x * 30, y * 30);
                this.buttons[i].Name = "button" + i.ToString();
                this.buttons[i].Size = new System.Drawing.Size(30, 30);
                this.buttons[i].TabIndex = 0;
                this.buttons[i].UseVisualStyleBackColor = true;
                if (x != 3)
                {
                    x++;
                }
                else if (x == 3)
                {
                    x = 0;
                    y++;
                }
                else if (x == 3 && y == 3)
                {
                    break;
                }                
            }

            // 
            // Miner
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            for (int i = 0; i <= 9; i++)
            {
                this.Controls.Add(this.buttons[i]);
            }
            this.Name = "Miner";
            this.Text = "Miner";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Button[] buttons;
        int x = 0;
        int y = 0;
    }
}

Danke für eure Hilfe 😃

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo CamelxDDD,

warum schreibst du den Code in InitializeComponent? Das sollte man so eigentlich nicht machen. Der Designer erzeugt dort Code und kann unter umständen zu Problemen führen. Im Designer => Rechtsklick => Code-Ansicht. Schreib dort den Code rein.

zero_x

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo CamelxDDD,

herzlich willkommen auf myCSharp!

Trotzdem muss ich dich sofort zu Beginn auf [Hinweis] Wie poste ich richtig? hinweisen.

Jedoch will es partout nicht funktionieren.
Kann mir bitte einer sagen warum?

Das ist eine denkbar ungünstige Fragestellung, s. Punkt 5 "Problem genau beschreiben, inkl. genauer Fehlermeldung". Was genau passiert bzw. passiert eben nicht?

Generell gilt: Verändere nie manuell den Code, der vom Designer erzeugt wird. Bei jeder Aktualisierung wird der nämlich mit dem neu generierten Code überschrieben.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

12 Beiträge seit 2006
vor 13 Jahren

ungefähr so...



    public partial class Form1 : Form {

        private System.Windows.Forms.Button[] _Buttons;

        public Form1() {
            InitializeComponent();

            initializeField();

        }

        private void initializeField() {

            this.SuspendLayout();

            int x = 0;
            int y = 0;

            //Magic happens here ;)
            _Buttons = new Button[9];

            for (int index = 0; index < 9; index++) {

                createButton(x, y, index);

                //Nicht schön... aber hoffentlich nachvollziehbar
                if (x < 2) {
                    x++;
                } else {
                    x = 0;
                    y++;
                }

            }

            this.ResumeLayout();

        }

        private void createButton(int X_, int Y_, int Index_) {

            this._Buttons[Index_] = new System.Windows.Forms.Button();


            this._Buttons[Index_].Location = new System.Drawing.Point(X_ * 30, Y_ * 30);
            this._Buttons[Index_].Name = "button" + Index_.ToString();
            this._Buttons[Index_].Size = new System.Drawing.Size(30, 30);
            this._Buttons[Index_].TabIndex = 0;
            this._Buttons[Index_].UseVisualStyleBackColor = true;
            
            this.Controls.Add(this._Buttons[Index_]);

        }
        
    }
        

geht aber noch eleganter...

(ja|nein|vielleicht)*

C
112 Beiträge seit 2009
vor 13 Jahren
//Nicht schön... aber hoffentlich nachvollziehbar  
                if (x < 2) {  
                    x++;  
                } else {  
                    x = 0;  
                    y++;  
                }  

Das geht in die Hose. Du musst x solange inkrementieren, bis x % 3 = 0, dann haste 3 in einer Reihe, dann musste y einmal inkrementieren und x auf 0 stellen, um die nächste Reihe mit 3 Buttons zu füllen

Grüße

Christian

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo chriscolm,

deinem Vorschlag haut nicht wirklich hin, denn 0 % 3 wäre 0 und daher würde er nie in den ++x-Teil kommen, zumindest nicht, nachdem x das erste Mal auf 0 gesetzt wurde.

Dagegen sehe ich nicht, warum es x < 2 nicht tun sollte. Beim ersten Durchlauf ist x 0, beim zweiten 1 und beim dritten 2, weshalb er in den else-Teil geht und x wieder auf 0 zurücksetzt und y um eins erhöht. Alles paletti, oder?

herbivore

12 Beiträge seit 2006
vor 13 Jahren

@chriscolm:

//Nicht schön... aber hoffentlich nachvollziehbar hatte seine Bedeutung 😉

@herbivore: Danke für die Argumentation 😃

...mit Modulo... und schöner... und beliebiger ^^


        private void initializeField() {

            int buttonsInRow    = 5;
            int numberOfButtons = 13;

            int x = 0;
            int y = 0;

            this.buttons = new Button[numberOfButtons];

            for (int i = 0; i < numberOfButtons; i++) {

                x = i % buttonsInRow;
                y = i / buttonsInRow;

                createButton(i, x, y);

            }
        
        }

(ja|nein|vielleicht)*

C
CamelxDD Themenstarter:in
16 Beiträge seit 2010
vor 13 Jahren
Thx

Vielen Dank Smoni.
Hat mir Wirlkich geholfen!
Und so schlimm fand ich diesen Code nun auch wieder nicht

//Nicht schön... aber hoffentlich nachvollziehbar
                if (x < 2) {
                    x++;
                } else {
                    x = 0;
                    y++;
                }

Nochmals Danke
CamelxDDD