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

Отслеживание события нажатия кнопки на форме

22.12.2015, 15:09. Показов 6669. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу - тестер для студентов (заодно выслушаю критику по коду)
Есть xml-файлик с вопросами и вариантами ответов, а так же зашифрованным правильным ответом (шифровал простым XOR-алгоритмом) метод реализации шифрования прилагается:
C#
1
2
3
4
5
6
7
8
9
public static string Encrypt(byte[] cryptingStr, int cryptingKey)
        {            
            byte[] mass = new byte[cryptingStr.Length];
            for (int ci = 0; ci < mass.Length; ci++)
            {
                mass[ci] = (byte)(cryptingStr[ci] ^ cryptingKey);
            }
            return Encoding.Unicode.GetString(mass);
        }
Есть следующий метод "Рандом без повторений" с использованием списка для выборки, например, 10 случайных вопросов из 100 возможных (подсмотрел исходник):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public object[] RandomQuestArr()
        {
            Random rnd = new Random();
            List<object> objects = new List<object>();
            while (objects.Count != quest_count)
            {
                int q = rnd.Next(1,quest_list_count);
                if (!objects.Contains(q))
                {
                    objects.Add(q);
                }
            }
            return objects.OrderBy(o => o).ToArray();
        }
При загрузке формы вызываю этот метод.
Затем по нажатию кнопки "Старт" хочу вызывать метод поиска и вывода на форму вопроса и ответов к нему (номера вопросов хранятся в массиве, который заполнился при загрузке формы). На форме имею label для вопроса и 4 radiobutton для вариантов ответа. Вот метод для этого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void SearchQuest(int number)
        {
            string xml_name = @"C:\Users\admin\Documents\Visual Studio 2008\Projects\XML_Tester\XML_Tester\quest.xml";
            XDocument xml_doc = XDocument.Load(xml_name);
            foreach (XElement el in xml_doc.Root.Elements())
            {
                if (el.Attribute("id").Value == number.ToString())
                {
                    label1.Text = el.Element("Question").Value;
                    radioButton1.Text = el.Element("OptionA").Value;
                    radioButton2.Text = el.Element("OptionB").Value;
                    radioButton3.Text = el.Element("OptionC").Value;
                    radioButton4.Text = el.Element("OptionD").Value;
                    break;
                }
            }
        }
Но, увы, не могу увязать все это, т.к. никак не соображу как организовать цикл, чтобы отследить нажатие кнопки "Далее", которая, проверит правильность ответа (тут все просто должно быть) и выведет на экран очередной вопрос (т.е. вновь вызовет метод SearchQuest, который принимает номер вопроса в общем списке, из последнего листинга).

Все сводится к банальному: как перехватить нажатие клавиши, для начала выполнения очередной итерации цикла.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.12.2015, 15:09
Ответы с готовыми решениями:

отслеживание события нажатия кнопки программно
подскажите как отследить нажатие кнопки в другом потоке не в главном где созданы контролы а в другом. идет бесконечный цикл где будет...

Отслеживание нажатия кнопки на форме.
Добрый день. Вот столкнулся с такой проблемой. Вопрос прост: Как отследить событие нажатия кнопки на форме и ,допустим, вывести...

Создайте обработчик события нажатия кнопки мыши на форме (Click), который будет устанавливать все кнопки в активный режи
Доброго времени суток! Помогите сделать задачу пожалуйста я полный ноль! (с описанием если можно:cry:) Уточните условие задания,...

9
0 / 0 / 2
Регистрация: 22.12.2015
Сообщений: 8
22.12.2015, 15:18
ваш ответ в самом заголовке темы. в чём проблема?
0
1 / 1 / 0
Регистрация: 30.08.2014
Сообщений: 15
22.12.2015, 15:34  [ТС]
Как шутка принимается, а если серьезно, то не удается реализовать в коде. Я соглашусь, что туплю, возможно переработал сегодня, но имею детскую ошибку, не останавливая для ответа цикл на каждой итерации я вижу выборку по последнему элементу массива.
0
0 / 0 / 2
Регистрация: 22.12.2015
Сообщений: 8
22.12.2015, 16:25
Изофрукт, вы что-то совсем неправильно делаете.
создайте классы, которые будут описывать вопрос и варианты ответов:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
class Answer
{
    public string Text { get; set; }
    public bool Correct { get; set; }
}
 
class Question
{
    public string Text { get; set; }
    public List<Answer> Answers { get; set; }
}

генерируйте List из Question из XML:
Кликните здесь для просмотра всего текста
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
public List<Question> FromXml(string xml)
{
    var doc = XDocument.Parse(xml);
    var r = new List<Question>;
    
    foreach(var e in doc.Root.Elements()) 
    {
        if(!e.HasElements()) throw new Exception();
        
        var q = new Question();
        var a = new List<Answer>();
        
        q.Text = e.Attribute("text").Value;
        foreach(var i in e.Elements())
        {
            if(!i.HasAttributes()) throw new Exception();
            
            a.Add(new Answer {
                Text = i.Attribute("text").Value,
                Correct = Convert.ToBoolean(i.Attribute("correct"))
            });
        }
        
        q.Answers = a;
        r.Add(q);
    }
    
    return r;
}

затем рандомно выбирайте любой вопрос(ы) из списка и получайте удобный класс Question для работы. свою проверку делайте в обработчике события:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
private void button1_Click(object sender, MouseEventArgs e)
{
    // ...
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.12.2015, 17:21
Цитата Сообщение от Изофрукт Посмотреть сообщение
как перехватить нажатие клавиши, для начала выполнения очередной итерации цикла.
Запустите цикл в отдельном потоке, останавливайте его на каждой итерации через EventWaitHandle и по нажатию клавиши продолжайте цикл.
1
1 / 1 / 0
Регистрация: 30.08.2014
Сообщений: 15
23.12.2015, 06:30  [ТС]
Спасибо, если верно понял, то как-то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        EventWaitHandle handle = new AutoResetEvent(false);
 
        private void button1_Click(object sender, EventArgs e)
        {
            new Thread(RunTester).Start();                                   
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            // Тут проверки на правильность ответа, а затем...
            handle.Set();
        }
 
        public void RunTester()
        {
            foreach (object o in obj)
            {
                SearchQuest((int)o);
                handle.WaitOne();
            }
        }
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.12.2015, 06:52
Цитата Сообщение от Изофрукт Посмотреть сообщение
если верно понял, то как-то так
Именно так, в общих чертах.
1
1 / 1 / 0
Регистрация: 30.08.2014
Сообщений: 15
23.12.2015, 14:56  [ТС]
Реализовал практически все, что хотел. Остались мелочи, даже invoke поддался легко. Но...
В основном потоке по нажатию button1 инициализирую новый поток, по нажатию button3 принудительно закрываю приложение через application.exit(), но поток остается висеть.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
        private void button1_Click(object sender, EventArgs e)
        {
            Thread RT = new Thread(delegate() {RunTester(obj);});
            RT.Start();       
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


В методе клика button3 не доступен поток RT, даже игрался c модификаторами доступа. В потоке RT так же нет возможности прекратить выполнение оного. Сориентируйте, пожалуйста.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.12.2015, 15:09
Цитата Сообщение от Изофрукт Посмотреть сообщение
Сориентируйте, пожалуйста.
Или сделать поток фоновым (свойство IsBackground),
или использовать конструкцию Task.Factory.StartNew(() => {...});
1
1 / 1 / 0
Регистрация: 30.08.2014
Сообщений: 15
23.12.2015, 15:20  [ТС]
Task не могу использовать, на сколько я помню, появился он в 4.0, а я пишу под 3.5 в Visual C# 2008 Express. А вот с фоновым все получилось, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2015, 15:20
Помогаю со студенческими работами здесь

Не работает обработка события нажатия кнопки клавиатуры в форме
Здравствуйте! Есть проблема, задали курсовик, но не получается реализовать несколько моментв: 1. Почему то не срабатывает функция...

Вызов события нажатия кнопки в другой форме и закрытие вызывающей событие формы
Здравствуйте, столкнулся с такой проблемой: хочу из дочерней формы вызвать событие нажатия кнопки основной (или какой-либо иной формы) и...

Создайте обработчик события нажатия кнопки мыши на форме (Click), который будет очищать поле ввода
Делаю лабу: Разместите на форме поле ввода (TextBox), метку (Label) и кнопку (Button). Создайте обработчик события нажатия на кнопку,...

Отслеживание нажатия кнопки на контроле
Привет.Сделал контрол что то типа трекбара для плеера. using System; using System.Collections.Generic; using...

Отслеживание нажатия кнопки на панели
На панели расположено 94 кнопки. Подскажите, пожалуйста, как отследить нажатие каждой из них не используя свойство button_Click


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru