Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема, сложно объяснить...читайте 
:(
    Опции темы
fromrus
Дата 20.6.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



Код

public static void DisplayFoldersAndFiles(string str, ListBox list)
        {
            DirectoryInfo[] dirs = new DirectoryInfo(str).GetDirectories();
            FileInfo[] files = new DirectoryInfo(str).GetFiles(); ;
            list.Items.Clear();
            //list1.Items.Add((object)"[...]");
            foreach (DirectoryInfo dir in dirs)
            {
                list.Items.Add(dir.Name);
            }
            foreach (FileInfo file in files)
            {
                list.Items.Add(file.Name);
            }

Код

void DisplayLocalDrives()
        {
            DriveInfo[] drives = DriveInfo.GetDrives();           
            foreach (DriveInfo drive in drives)
            {
                b = new Button(); b1 = new Button();
                b.Content = drive.Name; b.Click += LocalDiskClick;
                b1.Content = drive.Name; b1.Click += LocalDiskClick1;
                b.Margin = new Thickness(3); b1.Margin = new Thickness(3);
                leftPanel.Children.Add(b); rightPanel.Children.Add(b1);
            }
        }

Код

void LocalDiskClick(object sender, RoutedEventArgs e)
        {
            FileSystem.DisplayFoldersAndFiles(b.Content.ToString(),leftBox);
        }

Функция DisplayFoldersAndFiles-отображает файлы и папки в ЛистБоксе по данному(str) адресу.Функция DisplayLocalDrives-отображает кнопки,в которых написаны имена локальных дисков,по нажатию на кнопку в лист боксе отображается содержимое конкретного диска.
В обработчике просто вызывается DisplayFoldersAndFiles.Дело в том,что при дебаге я узнал(неожиданно для себя),что str-параметр всегда равен "K:\\",т.е. я кликаю на кнопку,где написано C:\\ (str="C:\\"),а у меня все равно str="K:\\"(это съемник в моей системе,стоит последним в списке дисков).В чем проблема?
PM MAIL ICQ   Вверх
Idsa
Дата 20.6.2008, 15:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



fromrus, для WPF у нас есть отдельный раздел. В будущем задавайте вопросы там.

Теперь по коду. Такое ощущение, что b у вас объявлена на уровне класса, поэтому неудивительно, что в этой переменной хранится ссылка на последнюю кнопку, создаваемую в foreach.
1. Необходимо убрать переменную b из объявления на уровне класса.
2. В методе DisplayLocalDrives для создания кнопки необходимо использовать локальную переменную:
Код

void DisplayLocalDrives()
        {
            DriveInfo[] drives = DriveInfo.GetDrives();           
            foreach (DriveInfo drive in drives)
            {
                Button b = new Button(); Button b1 = new Button(); //добавил объявление переменных b и b1
                b.Content = drive.Name; b.Click += LocalDiskClick;
                b1.Content = drive.Name; b1.Click += LocalDiskClick1;
                b.Margin = new Thickness(3); b1.Margin = new Thickness(3);
                leftPanel.Children.Add(b); rightPanel.Children.Add(b1);
            }
        }

3. В обработчике события приводим Sender к типу кнопки и  получаем имя диска:
Код

void LocalDiskClick(object sender, RoutedEventArgs e)
        {
            Button button = (Button)sender;
            FileSystem.DisplayFoldersAndFiles(button.Content.ToString(),leftBox);
        }



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
fromrus
Дата 20.6.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



ошибка была втом,что я не привел sender к типу Button,а с объявлением на уровне класса все норм-и так работает smile 
Я правда не понял,зачем мы это делаем?Можете объяснить?Это связано с маршрутизируемым событием???Если да,то почму?
А тему я не стал создавать в отдельной ветке,т.к. здесь вопрос скорее по C#,чем по разметке.
Спасибо! smile 
PM MAIL ICQ   Вверх
Idsa
Дата 20.6.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Цитата(fromrus @  20.6.2008,  21:26 Найти цитируемый пост)
а с объявлением на уровне класса все норм-и так работает smile 

Работать-то работает, но функциональности не добавляет. А делать переменную с уровнем доступа, большим, чем ей нужен, - неправильно.

Цитата(fromrus @  20.6.2008,  21:26 Найти цитируемый пост)
Я правда не понял,зачем мы это делаем?Можете объяснить?Это связано с маршрутизируемым событием???Если да,то почму?

Нет, это никак не связано ни с маршрутизацией событий, ни с какими-либо другими фишками WPF.
Дело в том, что Вы в методе-обработчике клика обращались к переменной уровня класса b, которая содержала ссылку на кнопку, созданную при последней итерации foreach в DisplayLocalDrives. Это неверный подход. Обычно в ситуации, когда множеству объектов одного типа для обработки события передается делегат на один и тот же метод, для того, чтобы выяснить, какой же объект вызвал событие, используется параметр sender, приведенный к типу объекта.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
fromrus
Дата 20.6.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



[QUOTE=Idsa,20.6.2008,  17:35]
Цитата(fromrus @  20.6.2008,  21:26 Найти цитируемый пост)
.... Обычно в ситуации, когда множеству объектов одного типа для обработки события передается делегат на один и тот же метод, для того, чтобы выяснить, какой же объект вызвал событие, используется параметр sender, приведенный к типу объекта.

Т.е. привидение нуна делать,когда много объектов->один делегат->один метод.Так?
Если можно дайте плиз инфу по этому вопросу или ссылку почитать,или книжку,где прочитать,или,если вы совсем великодушны,не могли бы написать пример,демонстрирующий данную проблему.Спасибо!
PM MAIL ICQ   Вверх
Idsa
Дата 20.6.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Цитата(fromrus @  20.6.2008,  21:56 Найти цитируемый пост)
Т.е. привидение нуна делать,когда много объектов->один делегат->один метод.Так?

Необязательно. Приведение нужно делать, когда Вам нужна дополнительная информация об объекте-источнике события (помимо той, которая находится в EventArgs). Хотя если Вы знаете, например, что этот метод - обработчик события клик определенной кнопки, то можете не использовать sender, а напрямую обращаться к этой кнопке this.button1. Так что, действительно, наибольший смысл использование sender имеет тогда, когда один обработчик используется для событий нескольких объектов.

Цитата(fromrus @  20.6.2008,  21:56 Найти цитируемый пост)
Если можно дайте плиз инфу по этому вопросу или ссылку почитать,или книжку,где прочитать

Я в книгах по WinForms встречал такие примеры.

Цитата(fromrus @  20.6.2008,  21:56 Найти цитируемый пост)
если вы совсем великодушны,не могли бы написать пример,демонстрирующий данную проблему

Так Вы сами его и написали. Чуть выше smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
fromrus
Дата 20.6.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



один обработчик-несколько объектов,спасибо,на днях у петцольда поищу.
PM MAIL ICQ   Вверх
Kefir
Дата 20.6.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



fromrus, скажем так, приведение тут вообще не при чём. смысл всего этого предельно просто - допустим, у тебя есть энное количество кнопок (с разными надписями на них). Ты хочешь сделать так, чтобы при нажатии на кнопку появлялся месседж бокс с содержимым кнопки. Как это сделать? Первый вариант - объявить для каждой кнопки поле в классе (к примеру - button1, button2, ... button50) и для каждой кнопки в отдельности писать обработчик события Click:
Код

void buton1_Click(object sender, RoutedEventArgs e) {
  MessageBox.Show(this.button1.Content.ToString());
}
void buton2_Click(object sender, RoutedEventArgs e) {
  MessageBox.Show(this.button2.Content.ToString());
}
// ...

void buton50_Click(object sender, RoutedEventArgs e) {
  MessageBox.Show(this.button50.Content.ToString());
}

Однако, сразу становится ясно, что это - бед сивой кобылы - один и тот же код повторяется 50 раз. Поэтому можно написать этот обработичик следующим образом и всем 50-ти кнопкам поставить его на событие Click. 
Код

void buton50_Click(object sender, RoutedEventArgs e) {
  MessageBox.Show((sender as Button).Content.ToString());
}

sender содержит в себе ссылку на ту кнопку, которая послала событие Click. то есть если нажали на button1, то в sender будет button1 и так далее. Вот.

Если же интересует почему у sender тип object, то это лишь потому, что там может быть какой-угодно класс - не только Button, но так как мы знаем, что там у нас только кнопки, то можем приводить sender к Button. вот так.
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.