Программное изменение каталога в диалоговом окне открытия файла

У меня есть настроенный OpenFileDialog (VS2008, C #, Windows Forms) с ComboBox. В ComboBox будет список путей, которые пользователь может выбрать.

Мой вопрос: есть ли способ изменить каталог в диалоговом окне открытия файла, чтобы указать путь в выбранном элементе поля со списком.

InitialDirectory работает только до того, как я открою диалоговое окно, мне нужен способ программно изменить каталог после открытия диалогового окна.

Спасибо


person ababeel    schedule 03.05.2010    source источник
comment
Как это сработает? Пожалуйста, объясните подробнее.   -  person leppie    schedule 03.05.2010


Ответы (3)


Если вы используете Vista или Windows 7 с .NET 3.5 SP1, я рекомендую вам использовать свойство CustomPlaces в OpenFileDialog, а не настраиваемое поле со списком.

См. Эту статью MSDN (для WPF): http://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.customplaces(v=VS.100).aspx

Или эту статью MSDN (для Windows Forms): http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.customplaces(v=VS.100).aspx

В Windows 2000 и XP также можно настроить боковую панель мест. Но это сложнее и требует использования некоторого кода C ++ (через CLI / C ++, вероятно, лучше всего). Этот метод подробно описан в этой статье MSDN: http://msdn.microsoft.com/en-us/magazine/cc300434.aspx

Если вы категорически настроены на использование поля со списком, которое вы добавили в OpenFileDialog, вам, вероятно, просто нужно знать, какое сообщение Windows отправить в диалоговое окно. Боюсь, я не знаю, какое сообщение вам нужно отправить. Неприятные внутренние детали Win32 API диалогового окна Common Open / Save подробно описаны здесь: http://msdn.microsoft.com/en-us/library/ms646960(VS.85).aspx

Если вы можете выяснить, какие сообщения отправлять в окно, вероятно, способ сделать это - заполнить текстовое поле имени файла каталогом, который вы хотите переключить, чтобы имитировать нажатие кнопки OK. Если вы это сделаете, диалоговое окно переключится на этот каталог.

Отправка сообщений в это окно, вероятно, потребует от вас не использовать OpenFileDialog напрямую, а создать подкласс абстрактного класса FileDialog, на котором он основан.

person orj    schedule 03.05.2010

Просто установите свойство InitialDirectory для openFileDialog1

private void button1_Click(object sender, System.EventArgs e)
{
    Stream myStream = null;
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    openFileDialog1.InitialDirectory = cmbPath.SelectedValue.ToString();
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ;
    openFileDialog1.FilterIndex = 2 ;
    openFileDialog1.RestoreDirectory = true ;

    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        try
        {
            if ((myStream = openFileDialog1.OpenFile()) != null)
            {
                using (myStream)
                {
                    // Insert code to read the stream here.
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
        }
    }
}
person Oscar Cabrero    schedule 03.05.2010
comment
поле со списком встроено в ту же настраиваемую форму, что и открытое диалоговое окно. Следовательно, установка исходного каталога не будет работать, поскольку диалоговое окно уже открыто. - person ababeel; 03.05.2010

Как уже было сказано, InitialDirectory работает заранее, но зачем вам менять послесловия папки? FileOpenDialog - это модальный диалог, поэтому пользователь не может использовать что-либо еще в вашем приложении, кроме диалога. В чем преимущество и почему вы не хотите устанавливать папку? Похоже, вы используете неправильные инструменты для выполнения работы.

person RvdK    schedule 03.05.2010
comment
Поле со списком будет содержать самые последние использованные пути, которые пользователь может использовать. Фактически он имитирует FileOpen в 3Ds Max. - person ababeel; 03.05.2010
comment
можешь выложить видео? Вам нужен своего рода список истории недавно использованных файлов? Создать свою собственную форму, которая сочетает в себе использование FileOpenDialog и ваши собственные потребности? - person RvdK; 03.05.2010