| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > проблема |
| Автор: fromrus 20.6.2008, 14:52 | ||||||
Функция DisplayFoldersAndFiles-отображает файлы и папки в ЛистБоксе по данному(str) адресу.Функция DisplayLocalDrives-отображает кнопки,в которых написаны имена локальных дисков,по нажатию на кнопку в лист боксе отображается содержимое конкретного диска. В обработчике просто вызывается DisplayFoldersAndFiles.Дело в том,что при дебаге я узнал(неожиданно для себя),что str-параметр всегда равен "K:\\",т.е. я кликаю на кнопку,где написано C:\\ (str="C:\\"),а у меня все равно str="K:\\"(это съемник в моей системе,стоит последним в списке дисков).В чем проблема? |
| Автор: Idsa 20.6.2008, 15:22 | ||||
| fromrus, для WPF у нас есть отдельный раздел. В будущем задавайте вопросы там. Теперь по коду. Такое ощущение, что b у вас объявлена на уровне класса, поэтому неудивительно, что в этой переменной хранится ссылка на последнюю кнопку, создаваемую в foreach. 1. Необходимо убрать переменную b из объявления на уровне класса. 2. В методе DisplayLocalDrives для создания кнопки необходимо использовать локальную переменную:
3. В обработчике события приводим Sender к типу кнопки и получаем имя диска:
|
| Автор: fromrus 20.6.2008, 17:26 |
| ошибка была втом,что я не привел sender к типу Button,а с объявлением на уровне класса все норм-и так работает Я правда не понял,зачем мы это делаем?Можете объяснить?Это связано с маршрутизируемым событием???Если да,то почму? А тему я не стал создавать в отдельной ветке,т.к. здесь вопрос скорее по C#,чем по разметке. Спасибо! |
| Автор: fromrus 20.6.2008, 17:56 | ||
[QUOTE=Idsa,20.6.2008, 17:35]
Т.е. привидение нуна делать,когда много объектов->один делегат->один метод.Так? Если можно дайте плиз инфу по этому вопросу или ссылку почитать,или книжку,где прочитать,или,если вы совсем великодушны,не могли бы написать пример,демонстрирующий данную проблему.Спасибо! |
| Автор: Idsa 20.6.2008, 18:03 | ||||||
Необязательно. Приведение нужно делать, когда Вам нужна дополнительная информация об объекте-источнике события (помимо той, которая находится в EventArgs). Хотя если Вы знаете, например, что этот метод - обработчик события клик определенной кнопки, то можете не использовать sender, а напрямую обращаться к этой кнопке this.button1. Так что, действительно, наибольший смысл использование sender имеет тогда, когда один обработчик используется для событий нескольких объектов.
Я в книгах по WinForms встречал такие примеры.
Так Вы сами его и написали. Чуть выше |
| Автор: fromrus 20.6.2008, 18:11 |
| один обработчик-несколько объектов,спасибо,на днях у петцольда поищу. |
| Автор: Kefir 20.6.2008, 18:15 | ||||
fromrus, скажем так, приведение тут вообще не при чём. смысл всего этого предельно просто - допустим, у тебя есть энное количество кнопок (с разными надписями на них). Ты хочешь сделать так, чтобы при нажатии на кнопку появлялся месседж бокс с содержимым кнопки. Как это сделать? Первый вариант - объявить для каждой кнопки поле в классе (к примеру - button1, button2, ... button50) и для каждой кнопки в отдельности писать обработчик события Click:
Однако, сразу становится ясно, что это - бед сивой кобылы - один и тот же код повторяется 50 раз. Поэтому можно написать этот обработичик следующим образом и всем 50-ти кнопкам поставить его на событие Click.
sender содержит в себе ссылку на ту кнопку, которая послала событие Click. то есть если нажали на button1, то в sender будет button1 и так далее. Вот. Если же интересует почему у sender тип object, то это лишь потому, что там может быть какой-угодно класс - не только Button, но так как мы знаем, что там у нас только кнопки, то можем приводить sender к Button. вот так. |