Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 14.05.2014
Сообщений: 4

Нужно вывести адресс того элемента,на которуй нажал пользователь

14.05.2014, 07:38. Показов 1751. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно вывести значение j той PictureBox, которую нажал пользователь. Но после нажатия в lablebox всегда заноситься значение 8. Не понимаю, в чем тут проблема. Я новичек.
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
 private void Form1_Load(object sender, EventArgs e)
        {
            int io, jo,k;
            io = 0;
            jo = 0;
            k = 0;
            for (int i = 0; i<8 ; i++)
                for (int j = 0; j < 8; j++)
                {
                    
                        io = i;
                        
                        pictureBox[i, j].Click += (s, t) =>
                       {    PictureBox pb = (PictureBox)s;
 
                       label1.Text = Convert.ToString(j);
                      
                      
                           if ((k == 0) && (jo==0))
                           {
                               pb.BackColor = Color.Red;
                               k = 1;
                              
                           }
                           if ((k != 0) && (io != 0)) 
                           {
                               pb.BackColor = Color.Red;
                              
                               
                           }
                       };
                    
                }
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2014, 07:38
Ответы с готовыми решениями:

Вывести все элементы массива, которые больше того элемента, индекс которого вводит пользователь
Вывести все элементы массива, которые больше того элемента, индекс которого вводит пользователь! Как решить задачу?

Проверка : нажал ли пользователь клавишу
Извиняюсь за тупой вопрос. Нужна функция которая проверяет, нажал ли пользователь какую то клавишу или нет. Знаю только наподобие getch()...

Вывести ссылку в зависимости того авторизованн ли пользователь
]Доброго времени суток. Помогите. Нужно в зависимости от того авторизирован ли пользователь выводить ту или иную ссылку. Авторизованисть...

8
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.05.2014, 09:30
misha007, данная проблема возникла из-за недопонимания принципов работы с областью видимости переменных в C#. Вам нужно перечитать информацию по этому поводу, чтобы устранить пробелы в знаниях. У вас в label1 сохраняется значение переменной j, которое в ней находится на момент выполнения этого присваивания (клик по PictureBox'у), а не на момент добавления обработчика к событию Click.
Чтобы было понятнее. У вас открывается форма, выполняется обработчик события Load, где в цикле всем событиям Click всех PictureBox'ов присваивается обработчик. В конце выполнения метода Form1_Load значение переменной j равно 8. Переменная j фактически становится глобальной, но доступ к ней есть только из вашего обработчика события Click PictureBox'а. Так как в вашем обработчике значение переменной j не меняется, а из других областей видимости доступа к этой переменной нет, то при нажатии на любой PictureBox в ваш label1 будет записываться именно это значение, то есть 8.

Добавлено через 4 минуты
Кстати, значение переменной io тоже всегда будет равно 7, а не как вы, видимо, планирвоали.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
14.05.2014, 09:30
Лучший ответ Сообщение было отмечено misha007 как решение

Решение

А принцип передачи значения в подобный обработчик события Click Вы знаете?
Нужно положить j, например, в Tag к PictureBox, а оттуда уже доставать при необходимости. В текущем примере у Вас переменная просто итерируется в том числе и для вспомогательного класса, который генерируется для анонимной функции.
C#
1
2
3
4
5
6
7
8
9
10
11
12
            for (int j = 0; j < 10; j++)
            {
                pb[j] = new PictureBox() 
                { 
                    Size = new Size(30, 30), 
                    Location = new Point(40 * j, 0), 
                    BackColor = Color.Green, 
                    Tag = j 
                };
                Controls.Add(pb[j]);
                pb[j].Click += (s, a) => MessageBox.Show(((int)(s as PictureBox).Tag).ToString());
            }
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.05.2014, 09:34
Лучший ответ Сообщение было отмечено misha007 как решение

Решение

Решить данную проблему можно следующим образом:
C#
1
2
3
4
5
// какой то код ...
pictureBox[i, j].Tag = j; //Вставить вместо 12 строки вашего примера
// Какой то код ...
label1.Text = ((Control)sender).Tag.ToStirng(); // Вставить вместо 16 строки вашего примера
// Какой то код ...
Добавлено через 45 секунд
Spawn, опередили)
0
14.05.2014, 09:35

Не по теме:

kodv, пока я пример рисовал, Вы текст писали, с которым меня опередили :D

0
0 / 0 / 1
Регистрация: 14.05.2014
Сообщений: 4
14.05.2014, 15:18  [ТС]
Spawn, kodv, Спасибо большое за вашу отзывчивость и помощь! У меня возникло еще два небольших вопроса.
1) Локальный. У меня получилось сохранить одну из двух координат бокса, куда можно записать вторую координату?
2) Глобальный. Что бы вы посоветовали мне прочитать, чтобы мне лучше понимать данную тему?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.05.2014, 15:53
Цитата Сообщение от misha007
У меня получилось сохранить одну из двух координат бокса, куда можно записать вторую координату?
Туда же. В Tag можно записать все, что угодно. Можете записать в него массив, список или коллекцию. Можете создать структуру или класс, которые будут хранить нужные значения, а потом записать их в Tag.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
14.05.2014, 19:23
misha007, Шилдт, Троелсен... Данная тема это азы в общем-то...
0
0 / 0 / 1
Регистрация: 14.05.2014
Сообщений: 4
15.05.2014, 00:05  [ТС]
Еще раз спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2014, 00:05
Помогаю со студенческими работами здесь

Checkbox нажал пользователь или алгоритм?
Добрый день! При загрузке программы выставляются сохраненные значения Checkbox-ов. При этом срабатывает событие CheckedChenged и...

Определить на какой рядок нажал пользователь
Добрый вечер всем. При помощи следующей XAML Разметки и С# кода, из базы даных я получаю на экране свою таблицу телефонов. Как определять...

Как узнать, на какую кнопку нажал пользователь?
Есть некая база данных с которой считываем вопрос и ответы к нему printf(&quot;&lt;h3&gt;Вопрос: $text&lt;/h3&gt;&lt;br/&gt;&quot;); ...

Проверить не нажал ли пользователь кнопку завершения работы
Как проверить не нажал ли пользователь кнопку завершения работы в меню пуск?

Нужно чтоб изменялась сума денег после того как пользователь выбрал свою покупку
Подскажите как сделать так чтоб код выполнялся до тех пор пока метод не вернет 0 или баланс не будут равен 0 package returnMoney; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru