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

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

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

Author24 — интернет-сервис помощи студентам
Мне нужно вывести значение 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2014, 07:38
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 4 минуты
Кстати, значение переменной io тоже всегда будет равно 7, а не как вы, видимо, планирвоали.
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
14.05.2014, 09:30 3
Лучший ответ Сообщение было отмечено 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
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.05.2014, 09:34 4
Лучший ответ Сообщение было отмечено misha007 как решение

Решение

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

Не по теме:

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

0
0 / 0 / 1
Регистрация: 14.05.2014
Сообщений: 4
14.05.2014, 15:18  [ТС] 6
Spawn, kodv, Спасибо большое за вашу отзывчивость и помощь! У меня возникло еще два небольших вопроса.
1) Локальный. У меня получилось сохранить одну из двух координат бокса, куда можно записать вторую координату?
2) Глобальный. Что бы вы посоветовали мне прочитать, чтобы мне лучше понимать данную тему?
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
14.05.2014, 15:53 7
Цитата Сообщение от misha007
У меня получилось сохранить одну из двух координат бокса, куда можно записать вторую координату?
Туда же. В Tag можно записать все, что угодно. Можете записать в него массив, список или коллекцию. Можете создать структуру или класс, которые будут хранить нужные значения, а потом записать их в Tag.
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
14.05.2014, 19:23 8
misha007, Шилдт, Троелсен... Данная тема это азы в общем-то...
0
0 / 0 / 1
Регистрация: 14.05.2014
Сообщений: 4
15.05.2014, 00:05  [ТС] 9
Еще раз спасибо за помощь.
0
15.05.2014, 00:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2014, 00:05
Помогаю со студенческими работами здесь

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

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

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

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

Отобразить PrintDialog, и если пользователь нажал ОК - закрыть отчет
Есть небольшая база данных, призванная облегчить заполнение однотипных бланков: пользователь в...

Как отследить в Edit, что пользователь нажал Enter?
Господа извеняюсь за такой наивный вопрос , но что то совсем не получается сделать . Как отследить...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru