30/09/2018, 17:19
[C#] Làm thế nào để làm việc với button sinh ra nhờ vòng lặp?
E dùng vòng for để tạo các button như sau:
for (int i = 0; i < 20; i++)
for (int j = 0; j < 50; j++)
{
Button square = new Button();
square.Width = 20;
square.Height = 20;
square.Top = 20 * i;
square.Left = 20 * j;
square.Name = "square" + "_" + i.ToString() + "_" + j.ToString();
square.BackColor = System.Drawing.Color.Transparent;
square.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
square.Click += new System.EventHandler(this.square_Click);
this.Controls.Add(square);
}
Giờ e không biết làm thế nào trong phương thức square_Click để đổi màu cho button khi mình click vào ạ
Bài liên quan
Trong C++ của Qt hay C# mình thấy có cái gọi là object::sender(). Bạn thử tìm hiểu xem.
e thử sender không thay đổi đc ạ
A, e tìm được cách rồi ạ, e tạo 1 button mới rồi gán ép kiểu button cho sender là dùng đc ạ
Button btn = (Button) sender;
Mình thấy khi ép kiểu cho sender người ta thường dùng static_cast hơn là dùng (type) sender. Cái này mình cũng không rõ có mục đích gì, chắc là liên quan đến việc ép kiểu cho lớp được thừa kế gì đó.
Triệu hồi @ltd vào giải thích
Vấn đề nữa là e muốn làm việc với 1 button nào đó trong này mà chỉ niết name của nó là
square_1_1
chẳng hạn thì làm thế nào ạ?Sau khi ép kiểu sender về button rồi thì có thể lấy thuộc tính text của button sender để check, button có text nào thì sẽ thực hiện công việc tương ứng chẳng hạn… (Text này ko phải là tên đối tượng, mà là cái text đc chỉnh sửa trên button ấy)
vâng, nhưng ý e là ví dụ cái sender của e là
square_3_3
, giờ e muốnsquare_0_0
đếnsquare_3_3
đều có text là x thì phải làm sao ạ?E đã tách đc chỉ số của
square_3_3
ra rồi ạ, sau đó vòng lặp nên viết thế nào để làm việc đc vớisquare_i_j
ạ?a, e lại tìm được rồi ạ
stackoverflow.com
How to access a button using its name as a string in a for loop
bạn làm thế này xem có được không?
square.Tag = j;
square.Name = j.tostring();
qua sự kiện click
if ((int) (sender as Button).tag.Tostring() == (sender as bUtton).Name)
{
(sender as BUtton).backColor = Color.Red;
}