Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Открыть FolderBrowserDialog на определённом каталоге

29.01.2017, 20:17. Показов 2352. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возможно ли открыть диалоговое окно FolderBrowserDialog на определённой папке?
Например, "D:\temp".
VB.NET Скопировано
1
FolderBrowserDialog1.SelectedPath = "D:\temp"
не помогает. Вернее, нужная папка не перед глазами, её нужно искать прокручивая окно диалога.
На картинке приблизительно ожидаемый результат
Открыть FolderBrowserDialog на определённом каталоге
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2017, 20:17
Ответы с готовыми решениями:

Открыть FolderBrowserDialog на удаленной машине
Приветствую! Допиливаю под себя Клиент-Сервер Вопрос, я могу открыть использовать FolderBrowserDialog на клиентской машине? Допустим,...

Открыть FolderBrowserDialog через MVVM WPF, и считать путь до папки
Всем привет. Потратил уже целы день на реализацию MVVM и как то сделал через using Caliburn.PresentationFramework; class...

Получить список файлов в определенном каталоге
ДД! Как-то можно получить список всех файлов в определенном каталоге?

13
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
30.01.2017, 13:41 2
Попробуй так
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Dim t As New Timer()
 
        AddHandler t.Tick, Sub()
                               SendKeys.Send("{TAB}{TAB}{RIGHT}")
                               t.Stop()
                           End Sub
 
        Dim fbd As New FolderBrowserDialog
        fbd.SelectedPath = "C:\WINDOWS\system32\Microsoft"
        fbd.ShowNewFolderButton = False
        fbd.Description = "Выберите папку, в которой находятся ведомости"
        t.Interval = 10
        t.Start()
        If fbd.ShowDialog = DialogResult.OK Then
 
            path = fbd.SelectedPath
        End If
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
30.01.2017, 21:03  [ТС] 3
Orlangur1991, WinXp курсор становится на указанную папку (окошко диалога автоматически прокручивается) , а в Win 8.1 папки раскрываются до указанной но приходится прокручивать окно до этих папок самому
1
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
31.01.2017, 11:26 4
jkrnd, не совсем понял. Я на win 7 открываю, это выглядит так - папка выбирается, окно прокручивается до неё, но она просто внизу списка
Открыть FolderBrowserDialog на определённом каталоге
1
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
31.01.2017, 11:27 5
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

как вариант попробуй ещё заменить
VB.NET Скопировано
1
SendKeys.Send("{TAB}{TAB}{RIGHT}")
на
VB.NET Скопировано
1
SendKeys.Send("{TAB}{TAB}{DOWN}{DOWN}{DOWN}{UP}{UP}{UP}")
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
31.01.2017, 15:43  [ТС] 6
Цитата Сообщение от Orlangur1991 Посмотреть сообщение
SendKeys.Send("{TAB}{TAB}{DOWN}{DOWN}{DOWN}{UP}{UP}{UP}")
получилось, спасибо как же это объяснить?
Миниатюры
Открыть FolderBrowserDialog на определённом каталоге  
0
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
31.01.2017, 16:45 7
что именно? Почему не прокручивалось таким способом?
VB.NET Скопировано
1
SendKeys.Send("{TAB}{TAB}{RIGHT}")
Тут надо проверять на месте, убираем этот код, просто открываем folderbrowserdialog и нажимаем
tab tab вправо и смотреть, выделилась папка или нет.
Просто если нажимать вправо, то папка как-бы раскрывается из-за этого фокус падает на неё, второй же способ - это три раза нажать вниз и столько же вверх, то есть окно опять прокрутится, так как был выбран другой элемент
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
31.01.2017, 17:51  [ТС] 8
Orlangur1991, всё понял, спасибо.
0
 Аватар для dr_Morro
195 / 115 / 30
Регистрация: 05.08.2013
Сообщений: 491
01.02.2017, 16:18 9
Как-то очень на костыли похоже...
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
01.02.2017, 16:54  [ТС] 10
dr_Morro, зато работает жаль что разработчики VS об этом не позаботились
1
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
01.02.2017, 18:22 11
Цитата Сообщение от dr_Morro Посмотреть сообщение
Как-то очень на костыли похоже...
Куда же без них, родненьких?

Добавлено через 6 минут
Вот тут есть более интересное решение этой проблемы, но у меня срабатывало через раз, к сожалению. Зато костыль безотказен
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Public Module FolderBrowserLauncher
    ''' <summary>
    ''' Using title text to look for the top level dialog window is fragile.
    ''' In particular, this will fail in non-English applications.
    ''' </summary>
    Private Const _topLevelSearchString As String = "Browse For Folder"
 
    ''' <summary>
    ''' These should be more robust.  We find the correct child controls in the dialog
    ''' by using the GetDlgItem method, rather than the FindWindow(Ex) method,
    ''' because the dialog item IDs should be constant.
    ''' </summary>
    Private Const _dlgItemBrowseControl As Integer = 0
    Private Const _dlgItemTreeView As Integer = 100
 
    <DllImport("user32.dll", SetLastError := True)>
    Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function
 
    <DllImport("user32.dll")>
    Function GetDlgItem(ByVal hDlg As IntPtr, ByVal nIDDlgItem As Integer) As IntPtr
    End Function
 
    <DllImport("user32.dll", CharSet := CharSet.Auto)>
    Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInt32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function
 
    ''' <summary>
    ''' Some of the messages that the Tree View control will respond to
    ''' </summary>
    Private Const TV_FIRST As Integer = &H1100
    Private Const TVM_SELECTITEM As Integer = (TV_FIRST + 11)
    Private Const TVM_GETNEXTITEM As Integer = (TV_FIRST + 10)
    Private Const TVM_GETITEM As Integer = (TV_FIRST + 12)
    Private Const TVM_ENSUREVISIBLE As Integer = (TV_FIRST + 20)
 
    ''' <summary>
    ''' Constants used to identity specific items in the Tree View control
    ''' </summary>
    Private Const TVGN_ROOT As Integer = &H0
    Private Const TVGN_NEXT As Integer = &H1
    Private Const TVGN_CHILD As Integer = &H4
    Private Const TVGN_FIRSTVISIBLE As Integer = &H5
    Private Const TVGN_NEXTVISIBLE As Integer = &H6
    Private Const TVGN_CARET As Integer = &H9
 
 
    ''' <summary>
    ''' Calling this method is identical to calling the ShowDialog method of the provided
    ''' FolderBrowserDialog, except that an attempt will be made to scroll the Tree View
    ''' to make the currently selected folder visible in the dialog window.
    ''' </summary>
    ''' <param name="dlg"></param>
    ''' <param name="parent"></param>
    ''' <returns></returns>
    Public Function ShowFolderBrowser(ByVal dlg As FolderBrowserDialog, Optional ByVal parent As IWin32Window = Nothing) As DialogResult
        Dim result As DialogResult = DialogResult.Cancel
        Dim retries As Integer = 10
 
        Using t As New Timer()
            AddHandler t.Tick, Sub(s, a)
                If retries > 0 Then
                    retries -= 1
                    Dim hwndDlg As IntPtr = FindWindow(DirectCast(Nothing, String), _topLevelSearchString)
                    If hwndDlg <> IntPtr.Zero Then
                        Dim hwndFolderCtrl As IntPtr = GetDlgItem(hwndDlg, _dlgItemBrowseControl)
                        If hwndFolderCtrl <> IntPtr.Zero Then
                            Dim hwndTV As IntPtr = GetDlgItem(hwndFolderCtrl, _dlgItemTreeView)
 
                            If hwndTV <> IntPtr.Zero Then
                                Dim item As IntPtr = SendMessage(hwndTV, CUInt(TVM_GETNEXTITEM), New IntPtr(TVGN_CARET), IntPtr.Zero)
                                If item <> IntPtr.Zero Then
                                    SendMessage(hwndTV, TVM_ENSUREVISIBLE, IntPtr.Zero, item)
                                    retries = 0
                                    t.Stop()
                                End If
                            End If
                        End If
                    End If
 
                Else
                    '
                    '  We failed to find the Tree View control.
                    '
                    '  As a fall back (and this is an UberUgly hack), we will send
                    '  some fake keystrokes to the application in an attempt to force
                    '  the Tree View to scroll to the selected item.
                    '
                    t.Stop()
                    SendKeys.Send("{TAB}{TAB}{DOWN}{DOWN}{UP}{UP}")
                End If
            End Sub
 
            t.Interval = 10
            t.Start()
 
            result = dlg.ShowDialog(parent)
        End Using
 
        Return result
    End Function
End Module
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
01.02.2017, 21:45  [ТС] 12
Orlangur1991,
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim fbd As New FolderBrowserDialog
        fbd.Description = "Выберите папку," & vbLf + "в которой находятся ведомости"
        fbd.SelectedPath = "E:\Jura\VBP\Разное\Editor\Var1.1"
        fbd.ShowNewFolderButton = False
 
        If ShowFolderBrowser(fbd) = DialogResult.OK Then
            sPath = fbd.SelectedPath
            Label1.Text = sPath
        End If
    End Sub
на Win8.1 срабатывает отлично! И не нужно скрывать кнопку "Новая папка"

непонятно назначение второго параметра ShowFolderBrowser
0
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
02.02.2017, 15:18 13
jkrnd, вроде как задет владельца диалогового окна
IWin32Window
1
Испарился
 Аватар для HackerVlad
1733 / 629 / 45
Регистрация: 10.09.2021
Сообщений: 2,755
09.11.2023, 15:06 14
Это тема и меня интересует почему в майкрософте такой баг непонятно. Надо изучать исходники. Но заплатка через SendKeys меня явно не устраивает. Пробовал по таймеру получается через повторный запрос, но это тоже заплатка получается.

Добавлено через 2 минуты
Фича с TVM_ENSUREVISIBLE работает у меня тоже не всегда срабатывает, и то работает только через PostMessage

Добавлено через 52 секунды
Может в Windows 10 исправили этот глюк, не знаю. Самое смешное что в XP всё работает и не глючит. Глючить начало с семёрки значит.

Добавлено через 1 минуту
Проще использовать старый стиль который никогда не глючит.

Добавлено через 3 минуты
Скорее всего TVM_ENSUREVISIBLE нужно отправлять спустя какое-то количество времени, а именно когда диалог полностью отобразится и изменятся его размеры на экране.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2023, 15:06
Помогаю со студенческими работами здесь

Поочередно открывать файлы в определенном каталоге
Здравствуйте уважаемые программисты!!! Подскажите пожалуйста как написать, что бы прога поочередно открывала файл в определенном каталоге.

Как создать файл в определенном каталоге?
{ CreateDir(Edit1-&gt;Text); Edit2-&gt; } вот у меня создается с помощью функции createdir каталог имя его в поле едит1, я хочу чтоб в...

Как перебрать все файлы в определенном каталоге?
Люди, подскажите ламеру, как можно перебрать все файлы в определенном каталоге, включая просмотр подкаталогов???

Поиск и замена файла в определенном каталоге, проблема
Доброго времени суток! Есть необходимость в замене исполняемого файла на более свежий на 500+ машинах. Решил написать скриптик, в итоге...

Поиск и удаление определённого файла в определённом каталоге
Как в каталоге LOCAL (там же много папок) найти и удалить файл readmy.doc в cmd?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Конвейеры данных с Apache Kafka
Javaican 16.03.2025
В мире, где данные стали новой нефтью, Apache Kafka зарекомендовал себя как мощный инструмент для построения надежных и масштабируемых конвейеров данных. Созданный изначально командой LinkedIn в 2011. . .
Deno против Node.js: Будущее JavaScript рантайма
run.dev 16.03.2025
За последнее десятилетие Node. js стал абсолютным лидером среди JavaScript-рантаймов и фактическим стандартом для серверной разработки на JavaScript. Но в 2018 году тот же разработчик, который создал. . .
SwiftUI или UIKit - что выбрать для нового приложения iOS?
mobDevWorks 16.03.2025
Когда Apple представила SwiftUI на WWDC 2019, многим показалось, что дни UIKit сочтены. Новый декларативный фреймворк предлагал радикально иной подход к разработке интерфейсов. Вместо кропотливого. . .
Docker: Руководство для начинающих по созданию первого приложения
Mr. Docker 16.03.2025
Docker — это платформа, которая упаковывает ваше приложение и все его зависимости в стандартизированные блоки, называемые контейнерами. Эти контейнеры изолированы друг от друга и от основной системы,. . .
парные условия и обработка кодов возврата (errorlevels)
jigi33 16.03.2025
Расширенная версия скобок условий, внутри неё могут быть использованы || (логическое или), & (логическое и) и логика генерации и обработки ошибок в BASH скриптах #!/ bin/ bash # Расширенная. . .
идеальная отладка в BASH скриптах
jigi33 16.03.2025
#!/ bin/ bash # VARIANT 1 - using keys -v or -xv # set -v - set verify mode OR # set -xv - set xtrace + verify mode (maximum detalization) OR # VARIANT 2 - ADD AVESOME BLOCK FOR DEBUGGING or. . .
Protobuf в Go и новый Opaque API
golander 15.03.2025
Распределенные системы опираются на эффективные протоколы обмена данными — о чем вы, скорее всего, прекрасно знаете, если работаете с микросервисной архитектурой. Protocol Buffers (Protobuf) от. . .
Преобразование строк в C++: std::from_chars от C++17 до C++26
NullReferenced 15.03.2025
Конвертация строк в числа — задача, с которой сталкивается практически каждый C++ разработчик. Несмотря на кажущуюся простоту, эта операция таит множество подводных камней и неочевидных последствий. . .
Управление памятью в Java и новые сборщики мусора
Javaican 15.03.2025
Эффективное управление памятью всегда было ахиллесовой пятой высоконагруженных Java-приложений. При разработке на Java мы обычно полагаемся на автоматическое управление памятью через сборщики мусора. . .
Angular или Svelte - что выбрать?
Reangularity 15.03.2025
Во фронтенд-разработке Angular и Svelte представляют собой два совершенно разных подхода к решению схожих задач. Один — полноценный, мощный монолит с корпоративной поддержкой, другой — компактный,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер