Форум программистов, компьютерный форум, киберфорум
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. Показов 2358. Ответов 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,756
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
Ответ Создать тему
Новые блоги и статьи
Фишки Kotlin, которые все любят
Javaican 18.03.2025
Помню, как скептически относился к появлению "ещё одного языка для JVM" — мол, зачем нам что-то новое, когда есть Java? Но первый же проект на Kotlin заставил меня пересмотреть свое мнение. Код стал. . .
Списки и кортежи в Python: различия, особенности, применение
py-thonny 18.03.2025
Если вы когда-нибудь писали код на Python, то наверняка сталкивались с конструкциями вида или ('имя', 25, 'инженер'). Это и есть списки и кортежи — последовательности, хранящие упорядоченные наборы. . .
Интеграция JavaScript в Haskell
golander 18.03.2025
Ключевая особенность нового JS-бэкенда GHC — возможность создавать колбэки из JavaScript в Haskell-код. Это открывает дорогу разработке полноценных браузерных приложений, позволяя реагировать на. . .
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
Позиционировани­е Kafka Consumer и Seek-операции
Javaican 17.03.2025
Что же такое Consumer Seek в Kafka? По сути, это API-метод, который позволяет программно указать, с какой позиции (offset) Consumer должен начать или продолжить чтение данных из партиции. Без этого. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер