Tablica buttonów

0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void StworzPrzyciski()
        {
            Button[,] tab = new Button[11, 11];
            for (int i = 0; i<11;i++)
            {
                for (int j = 0; j < 11; j++)
                {
                    Controls.Add(tab[i, j]);
                    tab[i, j].Location = new Point(i, j);
                    tab[i, j].Size = new Size(20, 20);
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StworzPrzyciski();
        }
    }
} 

Chciałbym stworzyć tablicę buttonów. Wiem, że będą się nachodzić na siebie bo jeszcze nie myślałem o ich lokalizacji. Nie wiem dlaczego program mi wyświetla puste Form1. Ktoś coś poradzi?

0

W którym miejscu tworzysz konkretne przyciski w tablicy? ;)

0

Nie wiem, ale wydaje mi się że tutaj

Controls.Add(tab[i, j]);

są tworzone konkretne przyciski (widoczne).

1

Niestety, źle Ci się wydaje.
Ten przykład powinien dać Ci do zrozumienia:

using System;

public class Test
{
	class Foo{}
	public static void Main()
	{
		Foo[,] matrix = new Foo[10, 10];
		for(int y = 0; y < matrix.GetLength(0); ++y){
			for(int x = 0; x < matrix.GetLength(1); ++x)
				Console.Write("{0} ", matrix[x, y] == null);
			Console.WriteLine();
		}
	}
}

http://ideone.com/hH6d16

1

Mi to wygląda na to, że twoja metoda Form1_Load nigdy nie jest uruchamiana. Masz dodany event handler do zdarzenia Load formy?
Gdyby ta metoda się uruchamiała to dostawałbyś NullReferenceException.

0

Kurde to ja teraz nie wiem. SpartanPAGE! Rozumiem, że chodzi ci o to, że brakuje utworzenia obiektu (wywołania konstruktora)

tab[i,j]=new Button(); 

Niestety dalej przyciski nie pojawiają się.

Some_ONE! Możesz dokładniej napisać co mam zrobić, aby uruchamiała się funkcja Form1_Load?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void StworzPrzyciski()
        {
            Button[,] tab = new Button[11, 11];
            for (int i = 0; i<11;i++)
            {
                for (int j = 0; j < 11; j++)
                {
                    tab[i, j] = new Button();
                    Controls.Add(tab[i, j]);
                    tab[i, j].Location = new Point(i, j);
                    tab[i, j].Size = new Size(20, 20);
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StworzPrzyciski();
        }
    }
} 
1
  1. Usuń tą swoją metodę Form1_Load, w designerze kliknij podwójnie na puste miejsce formy i metoda ta doda się sama razem z handlerem.

Albo:

  1. W solution explorerze Form1.cs -> Form1.Designer.cs i tam w sekcji Form1 dodaj this.Load += new System.EventHandler(this.Form1_Load);
0
namespace WindowsFormsApplication1
{
    partial class Form1
    {
        /// <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>
        private void InitializeComponent()
        {
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion
    }
}

To jest mój kod z Form1.Designer. Teraz nie wiem czemu wyświetla mi się 1 przycisk.

0
        public Form1()
        {
            InitializeComponent();
        }

        Button[,] buttons;

        private void Form1_Load(object sender, EventArgs e)
        {
            buttons = new Button[11, 11];
            for (int j = 0; j < 11; j++)
                for (int i = 0; i < 11; i++)
                {
                    Button button = new Button();
                    button.Location = new Point(i * 22, j * 22);
                    button.Size = new Size(21, 21);
                    button.Text = "•";
                    Controls.Add(button);
                    buttons[i, j] = button;
                }
        }
0

I jeszcze jedno pytanie. Mając taką tablicę buttonów jak mogę utworzyć event dla konkretnego buttonu, np. dla buttonu

buttons[3,4]

?

1
buttons[3, 4]./*event*/ += new EventHandler(...);
2

jak mogę utworzyć event dla konkretnego buttonu

Masz przykład pokazany w kodzie który wkleiłeś, w metodzie InitializeComponent.

Najlepiej jeszcze wewnątrz pętli

button.Click += new EventHandler(Button_Click);

w ten sposób wszystkie przyciski będą miały tę samą metodę zdarzenia, a przycisk który wywołał zdarzenie będzie w parametrze Sender metody.

Oczywiście możesz zrobić

buttons[3,4].Click += ...

ale jeśli tak chciałbyś zrobić 121 metod na kliknięcie, to nie tędy droga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1