Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/86: Рейтинг темы: голосов - 86, средняя оценка - 4.77
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337

Создание кнопок в цикле

26.08.2010, 16:30. Показов 18095. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно создать кнопки в приложение в цикле.

Код примерно такой:

Объявляем переменную:

C#
1
int hmb = 16;
И потом нужно создать цикл, в котором кнопки создавались каждая под новым номером:

C#
1
2
3
4
for (int i = 0; i <= hmb; i++)
            {
                Button ("button" + i) = new Button();
            }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2010, 16:30
Ответы с готовыми решениями:

Создание кнопок программно в цикле
Пытаюсь создать несколько кнопок в цикле. Dim Btn As New Button Dim F As Long For F = 1 To Val(Me.KOL_VO.Text)...

Подписать на событие несколько кнопок в цикле
Как пройтись по всем кнопкам и поставить событие: private void buttons_MouseEnter(object sender, EventArgs e) { ...

Обработка нажатия нескольких кнопок, созданных в цикле
Есть форма с вкладками, в первой вкладке находится DataGridView, (номер, компонент, массовая доля, расход), при нажатии на кнопку...

9
Заблокирован
26.08.2010, 16:44
Создаёшь массив

C#
1
private Button[] _buttons = new Button[16];
Создаёшь кнопки

C#
1
2
3
4
5
6
7
8
for (int i = 0; i < _buttons.Length; i++)
{
    _buttons[i] = new Button();
    _buttons[i].Location = new Point(_buttons[i].Width*i, 0);
    _buttons[i].Text = string.Format("Button {0}", i);
    _buttons[i].Tag = i;
    this.Controls.Add(_buttons[i]);
}
Вешаешь события

C#
1
2
3
foreach (Button btn in _buttons)
    btn.Click += (b, eArgs) => 
        MessageBox.Show(string.Format("Hello from button #{0}", ((Button)b).Tag));
1
Padawan
 Аватар для Johnny_D
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
26.08.2010, 16:44
ну все верно, только я бы рекомендовал использовать массик кнопок
в цикле
C#
1
2
3
4
button[i] = new button();
button[i].Name = ...
button[i].Wight = ..
button[i].Left = ...
и тд и тп
0
Заблокирован
26.08.2010, 16:54
yura097, ты бы сразу сказал, что тебе для пятнашек нужно. Ибо телепаты в летнем отпуске.

Тогда цикл for из моего поста нужно переписать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i = 0; i < _buttons.Length; i++)
 {
    _buttons[i] = new Button();
 
    _buttons[i].Width = 50;
    _buttons[i].Height = 50;
 
    int x = i / 4;
    int y = i % 4;
    _buttons[i].Location = new Point(_buttons[i].Width * x, _buttons[i].Height * y);
    _buttons[i].Text = (i + 1).ToString();
    _buttons[i].Tag = i;
    this.Controls.Add(_buttons[i]);
}

Не по теме:

Ты в соседней теме на меня чёта там возмущался по поводу моего нубства,
а тут оказывается, что тебе 14 лет и ты не знаешь, как в рантайме кнопки созавать. Весело, ага.

Изображения
 
0
Padawan
 Аватар для Johnny_D
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
26.08.2010, 16:55
NightmareZ, ну ты таки телепат, я тут про пятнашки ничего не вижу )
0
Заблокирован
26.08.2010, 17:35
Цитата Сообщение от Johny_D Посмотреть сообщение
NightmareZ, ну ты таки телепат, я тут про пятнашки ничего не вижу )

Я посмотрел, какие он темы до этого создавал и обратил внимание на число 16 в первом посте.

Добавлено через 38 минут
Я тут набросал чуть более удобно и чтоб можно было их двигать мышкой....

Создаём массив, который будет являться полем для пятнашек:
C#
1
private Button[,] _buttons = new Button[4, 4];
Метод для обмена значениями между пятнашками, если это возможно (значение 16 соответствует невидимой кнопке):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void SwapButtons(int x, int y)
{
    int x2 = x;
    int y2 = y;
 
    if (x > 0 && _buttons[x - 1, y].Text == @"16")
        x2 = x - 1;
    else if (x < 3 && _buttons[x + 1, y].Text == @"16")
        x2 = x + 1;
    else if (y > 0 && _buttons[x, y - 1].Text == @"16")
        y2 = y - 1;
    else if (y < 3 && _buttons[x, y + 1].Text == @"16")
        y2 = y + 1;
    else
        return;
 
    string txt = _buttons[x, y].Text;
    _buttons[x, y].Text = _buttons[x2, y2].Text;
    _buttons[x2, y2].Text = txt;
}
Теперь, создаём кнопки. В свойстве Tag у нас хранится порядковый номер кнопки, а в свойстве Text собсна номер кнопки, который игрок видит на экране.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
    {
        var button = new Button();
 
        button.Width = 50;
        button.Height = 50;
 
        button.Location = new Point(button.Width * i, button.Height * j);
        button.Text = (j * 4 + i + 1).ToString();
        button.Tag = j * 4 + i;
 
        _buttons[i, j] = button;
        this.Controls.Add(button);
 
        if (button.Text == @"16")
        button.Visible = false;
    }
Вешаем обработчик события. Событие Click отвечает за нажатие по кнопке, событие TextChanged - нужно для того, чтобы скрывать невидимую шестнадцатую кнопку.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foreach (Button btn in _buttons)
{
    btn.Click += (b, eArgs) =>
    {
        var button = (Button) b;
        int i = (int) button.Tag;
        int x = i%4;
        int y = i/4;
 
        SwapButtons(x, y);
    };
 
    btn.TextChanged += (b, eArg) =>
    {
        var button = (Button) b;
        int value = int.Parse(button.Text);
        button.Visible = value != 16;
    };
}
Перемешиваем кнопки:
C#
1
2
3
var rnd = new Random((int)DateTime.Now.Ticks);
for (int k = 0; k < 1000; k++)
    SwapButtons(rnd.Next(4), rnd.Next(4));
Ну вот и всё. Можно добавить проверку, не победил ли уже человек в обработчик события Click, и, если победил, вывести сообщение ему.
0
Padawan
 Аватар для Johnny_D
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
26.08.2010, 17:45
Цитата Сообщение от NightmareZ Посмотреть сообщение
Я посмотрел, какие он темы до этого создавал и обратил внимание на число 16 в первом посте.
Ну что ж, тогда молодец чувак. Не стал кричать, что ему нужен исходник игры, а попытался ее сам запрогать.
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
26.08.2010, 19:47  [ТС]
Да мне просто хочется что бы поле (4 на 4 или 8 на 8) ну итп создавалось одной переменной.... )

Добавлено через 4 минуты
Цитата Сообщение от NightmareZ Посмотреть сообщение
Я тут набросал чуть более удобно и чтоб можно было их двигать мышкой....
А за это огромное спасибо

Добавлено через 6 минут
Если тупо все цифры 4 на 5 заменить 5 на 5 поле создаёт но не очень корректно выставляют и кнопки в конце не двигаются.. ладно буду думать
0
Заблокирован
26.08.2010, 23:28
Цитата Сообщение от yura097 Посмотреть сообщение
Если тупо все цифры 4 на 5 заменить 5 на 5 поле создаёт но не очень корректно выставляют и кнопки в конце не двигаются.. ладно буду думать
Давай заново, только теперь чтоб можно было легко размер поля изменить.

Объявим константу, которая будет указывать ширину и высоту поля:
C#
1
private const int size = 8;
Общее количество кнопок:
C#
1
private const int buttonsCount = size * size;
Создаём массив, который будет являться полем для пятнашек:
C#
1
private Button[,] _buttons = new Button[size, size];
Текст на невидимой кнопке (ну, всмысле, если на кнопке будет отображено такое число, то будем скрывать её: для поля 4 на 4 число было 16):
C#
1
private readonly string InvisibleButtonText = buttonsCount.ToString();
Метод для обмена значениями между пятнашками, если это возможно (значение 16 соответствует невидимой кнопке):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void SwapButtons(int x, int y)
{
    int x2 = x;
    int y2 = y;
 
    if (x > 0 && _buttons[x - 1, y].Text == InvisibleButtonText)
        x2 = x - 1;
    else if (x < size - 1 && _buttons[x + 1, y].Text == InvisibleButtonText)
        x2 = x + 1;
    else if (y > 0 && _buttons[x, y - 1].Text == InvisibleButtonText)
        y2 = y - 1;
    else if (y < size - 1 && _buttons[x, y + 1].Text == InvisibleButtonText)
        y2 = y + 1;
    else
        return;
 
    string txt = _buttons[x, y].Text;
    _buttons[x, y].Text = _buttons[x2, y2].Text;
    _buttons[x2, y2].Text = txt;
}
Теперь, создаём кнопки. В свойстве Tag у нас хранится порядковый номер кнопки, а в свойстве Text собсна номер кнопки, который игрок видит на экране.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
    {
        var button = new Button();
 
        button.Width = 50;
        button.Height = 50;
 
        button.Location = new Point(button.Width * i, button.Height * j);
        button.Text = (j * size + i + 1).ToString();
        button.Tag = j * size + i;
 
        _buttons[i, j] = button;
        this.Controls.Add(button);
 
        if (button.Text == InvisibleButtonText)
            button.Visible = false;
    }
Вешаем обработчик события. Событие Click отвечает за нажатие по кнопке, событие TextChanged - нужно для того, чтобы скрывать невидимую шестнадцатую кнопку.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foreach (Button btn in _buttons)
{
    btn.Click += (b, eArgs) =>
    {
        var button = (Button)b;
        int i = (int)button.Tag;
        int x = i % size;
        int y = i / size;
 
        SwapButtons(x, y);
    };
 
    btn.TextChanged += (b, eArg) =>
    {
        var button = (Button)b;
        int value = int.Parse(button.Text);
        button.Visible = value != buttonsCount;
    };
}
Перемешиваем кнопки:
C#
1
2
3
var rnd = new Random((int)DateTime.Now.Ticks);
for (int k = 0; k < 100 * buttonsCount; k++)
    SwapButtons(rnd.Next(size), rnd.Next(size));
Миниатюры
Создание кнопок в цикле  
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
27.08.2010, 09:04  [ТС]
Как то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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 Пятнашки
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
 
 
        int size;
        int buttonsCount;
        int buttonsize = 60;
        Button[,] _buttons;
        string InvisibleButtonText;
        int step = 0;
 
        private void SwapButtons(int x, int y)
        {
            int x2 = x;
            int y2 = y;
 
            if (x > 0 && _buttons[x - 1, y].Text == InvisibleButtonText)
                x2 = x - 1;
            else if (x < size - 1 && _buttons[x + 1, y].Text == InvisibleButtonText)
                x2 = x + 1;
            else if (y > 0 && _buttons[x, y - 1].Text == InvisibleButtonText)
                y2 = y - 1;
            else if (y < size - 1 && _buttons[x, y + 1].Text == InvisibleButtonText)
                y2 = y + 1;
            else
                return;
 
            string txt = _buttons[x, y].Text;
            _buttons[x, y].Text = _buttons[x2, y2].Text;
            _buttons[x2, y2].Text = txt;
        }
 
        private void NewGame()
        {
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++)
                {
                    var button = new Button();
 
                    button.Width = buttonsize;
                    button.Height = buttonsize;
 
                    button.Location = new Point(button.Width * i, button.Height * j + 24);
                    button.Text = (j * size + i + 1).ToString();
                    button.Tag = j * size + i;
 
                    _buttons[i, j] = button;
                    this.Controls.Add(button);
 
                    if (button.Text == InvisibleButtonText)
                        button.Visible = false;
                }
            foreach (Button btn in _buttons)
            {
                btn.Click += (b, eArgs) =>
                {
                    var button = (Button)b;
                    int i = (int)button.Tag;
                    int x = i % size;
                    int y = i / size;
                    
                    SwapButtons(x, y);
                    step = step + 1;
                    stepstring.Text = ("Количество шагов: " + step);
                };
 
                btn.TextChanged += (b, eArg) =>
                {
                    var button = (Button)b;
                    int value = int.Parse(button.Text);
                    button.Visible = value != buttonsCount;
                };
            }
            var rnd = new Random((int)DateTime.Now.Ticks);
            for (int k = 0; k < 100 * buttonsCount; k++)
                SwapButtons(rnd.Next(size), rnd.Next(size));
            this.Height = size * buttonsize + 82;
            this.Width = size * buttonsize + 10;
        }
 
        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void x3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Пятнашки.Properties.Settings.Default.size = 3;
            Пятнашки.Properties.Settings.Default.newgame = 1;
            Пятнашки.Properties.Settings.Default.Save();
            Application.Restart();
        }
 
        private void x4ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Пятнашки.Properties.Settings.Default.size = 4;
            Пятнашки.Properties.Settings.Default.newgame = 1;
            Пятнашки.Properties.Settings.Default.Save();
            Application.Restart();
        }
 
        private void x5ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Пятнашки.Properties.Settings.Default.size = 5;
            Пятнашки.Properties.Settings.Default.newgame = 1;
            Пятнашки.Properties.Settings.Default.Save();
            Application.Restart();
        }
 
        private void x6ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Пятнашки.Properties.Settings.Default.size = 6;
            Пятнашки.Properties.Settings.Default.newgame = 1;
            Пятнашки.Properties.Settings.Default.Save();
            Application.Restart();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            if (Пятнашки.Properties.Settings.Default.newgame == 1)
            {
                Пятнашки.Properties.Settings.Default.newgame = 0;
                size = Пятнашки.Properties.Settings.Default.size;
                Пятнашки.Properties.Settings.Default.Save();
                buttonsCount = size * size;
                _buttons = new Button[size, size];
                InvisibleButtonText = buttonsCount.ToString();
                NewGame();
            }
        }
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2010, 09:04
Помогаю со студенческими работами здесь

Создание кнопок в цикле
Есть цикл, нужно в нем создавать кнопки. Был бы весьма признателен, не силен в html разметке да и в php тоже, разбираюсь инстинктивно. ...

Динамическое создание кнопок в цикле (Android)
создаю кнопки по циклу void show(){ public LinearLayout show; setContentView(R.layout.show_test); show =...

Нажатие кнопок в цикле
Всем привет, столкнулся с проблемой, подскажите пожалуйста как написать код программы, в которой цикл нажатия кнопок, т.е. нажал 1 (первую...

Изменение свойств кнопок в цикле
Доброго времени суток. Столкнулся с такой проблемой. Есть форма на которой около 400 кнопок. При нажатии на управляющие кнопки, группы по...

Как в диалоговом приложении VC++ в цикле вывести ряд кнопок button?
Собственно тема...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru