Ограниченный множественный выбор в диалоговом окне «Открыть файл»?

#vb.net

#vb.net

Вопрос:

Я хочу, чтобы у пользователя была возможность выбирать несколько файлов через openfiledialog, который у меня есть в моем коде, но затем, если пользователь выбирает файл из одной папки, ему будет разрешено выбирать другой файл только из этой конкретной папки. Каков наилучший способ решения этой проблемы?

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim openfiledialog1 As New OpenFileDialog
    With openfiledialog1
        .Title = "Select your models"
        .Filter = "Solidworks Files|*.sldprt;"
        .Multiselect = True
    End With
    If OpenFileDialog1.ShowDialog = DialogResult.OK Then
        For Each mfile As String In openfiledialog1.FileNames
            
        '' Add all filenames in a txt file, in a column
        Next
    End If
End Sub
  

Комментарии:

1. Вы могли бы создать свою собственную форму, которая позволяет пользователю перемещаться по папкам и выбирать файлы из нескольких каталогов, добавляя все выбранные элементы в другой элемент управления по ходу работы (возможно, в поле списка?).

2. Чтобы уточнить, вы хотите, чтобы пользователь мог открыть диалоговое окно один раз и выбрать несколько файлов из разных папок одновременно? В этом вопросе есть комментарий и ответ, которые интерпретировали его двумя совершенно разными способами, и любой из них может быть действительным на основе формулировки.

3. Я хочу, чтобы пользователь мог открывать файлы из нескольких папок, но когда он выбирает файл из одной из папок, он может выбрать другой файл только из той папки, где он выбрал первый. Итак, чтобы попытаться сделать это более понятным, поскольку я сохраняю имена файлов, выбранных пользователем, я хотел запретить пользователю заходить в одну папку и выбирать один файл, а затем переходить в другую и выбирать другой в том же диалоговом окне файла. Но поскольку я попытался углубиться в это, кажется, что по умолчанию диалоговое окно «открыть файл» не разрешает множественный выбор из разных папок

4. @Marc «Я хотел запретить пользователю заходить в одну папку и выбирать один файл, а затем переходить в другую и выбирать другой в том же диалоговом окне «Файл». Но поскольку я попытался углубиться в это, кажется, что по умолчанию диалоговое окно «открыть файл» не разрешает множественный выбор из разных папок» Re: Итак, в чем проблема?

Ответ №1:

Насколько я знаю, OpenFileDialog не предлагает способа запретить пользователю переход в другой каталог.

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

Вот полный пример:

 Private openFileDialog1 As New OpenFileDialog
Private modelsDirectory As String = Nothing

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    With openFileDialog1
        .Title = "Select your models"
        .Filter = "Solidworks Files|*.sldprt;"
        .Multiselect = True
        .FileName = Nothing
        ' Open the dialog and navigate to the previous direcoty by default.
        .InitialDirectory = modelsDirectory
    End With
    If openFileDialog1.ShowDialog <> DialogResult.OK Then Exit Sub

    Dim dirPath As String = IO.Path.GetDirectoryName(openFileDialog1.FileName)
    If modelsDirectory IsNot Nothing AndAlso 
       Not dirPath.Equals(modelsDirectory, StringComparison.OrdinalIgnoreCase) Then
        MessageBox.Show("Models must be selected from the following directory:" amp;
                        vbNewLine amp; modelsDirectory, "Restricted Directory")
        Exit Sub
    End If

    ' Store the value of the current directory path.
    modelsDirectory = dirPath
    For Each filePath As String In openFileDialog1.FileNames
        ' TODO: use the selected files as you see fit.
    Next
End Sub
  

Возможно, в какой-то момент вам захочется снять это ограничение (например, если вы очистите список выбранных файлов). Вы можете добиться этого, просто установив modelsDirectory значение Nothing :

 Private Sub ClearFilesList
    ' TODO: clear the files.

    modelsDirectory = Nothing
End Sub