![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| fromrus |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 30.3.2008 Репутация: нет Всего: нет |
Функция DisplayFoldersAndFiles-отображает файлы и папки в ЛистБоксе по данному(str) адресу.Функция DisplayLocalDrives-отображает кнопки,в которых написаны имена локальных дисков,по нажатию на кнопку в лист боксе отображается содержимое конкретного диска. В обработчике просто вызывается DisplayFoldersAndFiles.Дело в том,что при дебаге я узнал(неожиданно для себя),что str-параметр всегда равен "K:\\",т.е. я кликаю на кнопку,где написано C:\\ (str="C:\\"),а у меня все равно str="K:\\"(это съемник в моей системе,стоит последним в списке дисков).В чем проблема? |
||||||
|
|||||||
| Idsa |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 6 Всего: 62 |
fromrus, для WPF у нас есть отдельный раздел. В будущем задавайте вопросы там.
Теперь по коду. Такое ощущение, что b у вас объявлена на уровне класса, поэтому неудивительно, что в этой переменной хранится ссылка на последнюю кнопку, создаваемую в foreach. 1. Необходимо убрать переменную b из объявления на уровне класса. 2. В методе DisplayLocalDrives для создания кнопки необходимо использовать локальную переменную:
3. В обработчике события приводим Sender к типу кнопки и получаем имя диска:
|
||||
|
|||||
| fromrus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 30.3.2008 Репутация: нет Всего: нет |
ошибка была втом,что я не привел sender к типу Button,а с объявлением на уровне класса все норм-и так работает
Я правда не понял,зачем мы это делаем?Можете объяснить?Это связано с маршрутизируемым событием???Если да,то почму? А тему я не стал создавать в отдельной ветке,т.к. здесь вопрос скорее по C#,чем по разметке. Спасибо! |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 6 Всего: 62 |
Работать-то работает, но функциональности не добавляет. А делать переменную с уровнем доступа, большим, чем ей нужен, - неправильно.
Нет, это никак не связано ни с маршрутизацией событий, ни с какими-либо другими фишками WPF. Дело в том, что Вы в методе-обработчике клика обращались к переменной уровня класса b, которая содержала ссылку на кнопку, созданную при последней итерации foreach в DisplayLocalDrives. Это неверный подход. Обычно в ситуации, когда множеству объектов одного типа для обработки события передается делегат на один и тот же метод, для того, чтобы выяснить, какой же объект вызвал событие, используется параметр sender, приведенный к типу объекта. |
|||
|
||||
| fromrus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 30.3.2008 Репутация: нет Всего: нет |
[QUOTE=Idsa,20.6.2008, 17:35]
Т.е. привидение нуна делать,когда много объектов->один делегат->один метод.Так? Если можно дайте плиз инфу по этому вопросу или ссылку почитать,или книжку,где прочитать,или,если вы совсем великодушны,не могли бы написать пример,демонстрирующий данную проблему.Спасибо! |
|||
|
||||
| Idsa |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 6 Всего: 62 |
Необязательно. Приведение нужно делать, когда Вам нужна дополнительная информация об объекте-источнике события (помимо той, которая находится в EventArgs). Хотя если Вы знаете, например, что этот метод - обработчик события клик определенной кнопки, то можете не использовать sender, а напрямую обращаться к этой кнопке this.button1. Так что, действительно, наибольший смысл использование sender имеет тогда, когда один обработчик используется для событий нескольких объектов.
Я в книгах по WinForms встречал такие примеры.
Так Вы сами его и написали. Чуть выше |
||||||
|
|||||||
| fromrus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 30.3.2008 Репутация: нет Всего: нет |
один обработчик-несколько объектов,спасибо,на днях у петцольда поищу.
|
|||
|
||||
| Kefir |
|
||||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: нет Всего: 87 |
fromrus, скажем так, приведение тут вообще не при чём. смысл всего этого предельно просто - допустим, у тебя есть энное количество кнопок (с разными надписями на них). Ты хочешь сделать так, чтобы при нажатии на кнопку появлялся месседж бокс с содержимым кнопки. Как это сделать? Первый вариант - объявить для каждой кнопки поле в классе (к примеру - button1, button2, ... button50) и для каждой кнопки в отдельности писать обработчик события Click:
Однако, сразу становится ясно, что это - бед сивой кобылы - один и тот же код повторяется 50 раз. Поэтому можно написать этот обработичик следующим образом и всем 50-ти кнопкам поставить его на событие Click.
sender содержит в себе ссылку на ту кнопку, которая послала событие Click. то есть если нажали на button1, то в sender будет button1 и так далее. Вот. Если же интересует почему у sender тип object, то это лишь потому, что там может быть какой-угодно класс - не только Button, но так как мы знаем, что там у нас только кнопки, то можем приводить sender к Button. вот так. |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |