![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
dezmond06 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Есть учебная работа по С#. Задание такое - есть массив объектов Студент с полями Стипендия, факультет и т.д., в общем стандартная мура.
Задача проги, чтобы при нажатии кнопок PgUp, PgDn и Esc. стипендия всех студентов увелич. на 20%, уменьшалась на 20% и программа закрывалась соответственно. Реализовать надо событиями и делегатами. В общем что-то оно пытается работать, но вяленько. Принудительно вызываю событие, нажатие кнопок оно принимает, но меняет поле только у одного (первого) члена массива. Остальные на месте. Мне кажется тут что-то с областью видимости переменных, но где - не могу понять. В отладчике прогоняю, все члены инициализируются, обработчики цепляются. Класс, объявляющий события:
Фрагмент класса-приемника с обработчиками (Студент):
Фрагменты процедуры Main:
Смысл такой, надо чтобы прога постоянно ждала нажатия клавиши, при нажатии увелич/уменьшала стипендию сразу выводила результаты и опять продолжала ждать. Помогите, плиз! Это сообщение отредактировал(а) dezmond06 - 26.3.2011, 16:14 |
||||||
|
|||||||
dezmond06 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Неужели никаких мыслей нет???
![]() Задачка-то вроде несложная. Я уж все пересмотрел. Главное, что обработчик на escape срабатывает, то бишь из программы выходит. Да и на первый элемент массива все работает, и увеличение, и уменьшение. Подозреваю, что что-то где-то не там объявил, а где - фиг его знает. Может, на каждый объект массива надо создавать свой экземпляр события??? Хотя тоже пробовал вроде... Это сообщение отредактировал(а) dezmond06 - 28.3.2011, 14:09 |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
dezmond06, ты уменьшаешь и увеличиваешь стипндию так
однако, что такое grant из твоего кода непонятно(или я пропустил). В любом случае, если тебе надо внести изменения в весь список, то надо обходить весь массив или например воспользоваться Array.ForEach. Ты же меняешь значение grant, очевидно это и есть первый элемент. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
dezmond06 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Я привел не весь код класса Student, в принципе там ничего интересного, но для чистоты эксперимента:
Grant - примитивное свойство для доступа к полю scholarship. Но метод-обработчик (PgDn) объявлен-то у нас как динамич. метод класса, а не как статический, значит и вызываться и ловить событие он должен для каждого экземпляра класса Студент. Или я не прав? Пересмотрел кучу примеров (Шилдта, Рихтера и прочих), класс события создается вроде бы 1 раз у всех и ловить его должны все получатели, подписанные на него. Может быть я неверно подписываю? в конструкторе? может это надо делать не там? Делегаты объявлены вне классов, в namespace. Экземпляр события создается в main. Что я делаю не так? Это сообщение отредактировал(а) dezmond06 - 28.3.2011, 16:25 |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
dezmond06, я сразу не понял чего ты там делал. Просто несколько странно, для такой простой операции такую громадину сооружать. Кроме того, я так и не понял зачем это все. На самом деле впихивать в класс Student события ни к чему. Скорее надо либо создать класс, который будет вмещать всю коллекцию и у него в случае необходимости создать метод, которых будет изменять значение данного свойства всех студентов на заданную величину. Или делать это прямо в форме к примеру в обработчиках соответствующих событий. Собственно для того, чтобы это сделать надо всего лишь написать что-то вроде
И все элементы массива изменяться, к тому же не придется жестко привязывать эти действия к конкретным коэффициентам. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
dezmond06 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
В том то и дело, что это не моя прихоть, а исключительно требование по заданию, если буквально, то вот цитата: "... Класс Студент должен содержать следующие элементы:...метод-обработчик события нажатия клавиши PageUp, метод-обработчик события нажатия клавиши PageDown..." Я и сам люблю оптимизировать код, но в данном случае требуется выяснить, почему не работает мой способ, а не предлагать альтернативный. Ведь, таким образом, как у меня МОЖНО реализовать, и ничего экстраординарного тут нет. Так что создавать отдельный класс для массива студентов не годится. |
||||
|
|||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
dezmond06, Если я правильно понял задачу, то вот тебе упрощенный пример.
Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
dezmond06 |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Спасибо большое, заработало. Правда сделано все совсем не так, как у меня, но зато работает. EventHandler - это встроенный делегат. А со своим реально сделать? И еще вопросик: как повесить на событие статический метод, мне нужно удалить двоечников из массива. Я делаю по вашему образцу, сделал отдельный класс для аргументов события:
Создал метод для вызова события: [code=csharp] public void OnPushDel(DelEventArgs drr) { if (PushDel != null) PushDel(null, drr); }/code] В классе program сделал статич. поле события и вешаю на него обработчик - статич. метод класса program:
Далее соответствующая ветка case:
А вот сам метод удаления:
Событие срабатывает, но массив заполняется почему-то неправильно. Во все члены записывается один и тот же студент, опять что-то с областью видимости намутил, наверное. Скажите, как лучше осуществить передачу массива для последующей обработки? Может как-нибудь через ref-параметры, вместо того, чтобы с классом DelEventArgs возиться? Это сообщение отредактировал(а) dezmond06 - 30.3.2011, 11:09 |
||||||||||
|
|||||||||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Без разницы абсолютно, просто в данном случае свой создавать не требуется.
Ну то, что ты в классе аргументов выполняешь вывод на консоль и еще чего-то - это точно не мой образец. Аргументы события должны передавать в обработчик дополнительную информацию о событии. И не более того. А почему их просто не отфильтровать?
Или как-то так. Зачем мудрить? -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
dezmond06 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Ну вывод-то понятно, что это для отладки )) А как передать в метод массив объектов для обработки, если не через аргументы, то как? Это-то я и спрашивал. А фильтрация ваша на LINQ написана? P.S. Полдключил System.Xml.Linq - все равно выводит ошибку при компиляции "Error 1 'System.Array' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'System.Array' could be found (are you missing a using directive or an assembly reference?)" Это сообщение отредактировал(а) dezmond06 - 30.3.2011, 16:03 |
|||
|
||||
dezmond06 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Все разобрался, заработало. Конечно же мне никто не удосужился объяснить, что для использования линка нужно подключить референс System.Core, что по умолчанию он в консоли не подключается ))
Да и синтаксис лямбда-выражения у вас немного неверен, надо darr.stut = darr.stut.Where(x =>!x.isLoser).ToArray(); Но все равно очень помогли, большое спасибо! |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Вообще-то в шаблонах проектов все подключено, но в любом случае это уже совсем другой вопрос. Почему кто-то должен был отвечать на вопрос, который не задавался? От руки набрал, малость ошибся, в любом случае это был не код для копипасты, а пример того, как сделать лучше. Предполагалось, что синтаксис тебе известен. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
dezmond06 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 26.3.2011 Репутация: нет Всего: нет |
Может, я не писал, но я в дотнете только начинаю, так что далеко не все очевидное для вас очевидно для меня
![]() У меня в шаблоне консольного приложения автоматом Сore не подключается (стоит VS2008 Express). В любом случае, это ни в коем случае не недовольство. Еще раз спасибо за помощь, а то на других форумах голый вассер - на programmersforum и sql.ru - 100 просмотров и ни одного ответа, одно словоблудие. |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Просто когда создаешь проект там надо выбирать целевой фреймворк 3.5, у тебя наверно более ранняя версия выбрана, поэтому в шаблоне и отсутствуют нужные ссылки.
Просто у тебя там много напутано и разобраться трудно. Проще надо все делать. ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |