Иметь пользовательскую форму vb.net со списком, установленным на множественный выбор. Это для личного пользования. Список заполняется, когда форма загружается со всеми подпапками, только по имени, в указанной папке. Я хочу добавить префикс к каждой выбранной папке в списке. По умолчанию все папки будут иметь префикс, скажем, X. Так, например, Xfolder1 становится folder1, если выбрано и нажата кнопка отправки (не при изменении списка).
Вот мой код и псевдокод на данный момент. Получение строковых ошибок. Работает только первая подпрограмма, загрузка формы и заполнение списка. Большое спасибо за любую помощь. Здоровье и безопасность для всех во время этой пандемии.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each folder As String In System.IO.Directory.GetDirectories("D:\TestFolder\")
ListBox1.Items.Add(Path.GetFileName(folder))
Next
End Sub
Это псевдокод ofc
Private Sub RenameFolders(sender As Object, e As EventArgs) Handles Button1.Click
For i = 0 To ListBox1.Items.Count - 1
If Prefix Exists Then
FileIO.FileSystem.RenameDirectory(Prefix & FolderName, FolderName)
Else
FileIO.FileSystem.RenameDirectory(FolderName, Prefix & FolderName)
End If
Next
End Sub
Что выше и много исследований. Проблема может быть связана с тем, являются ли мои строки полным путем или просто именем папки. Listbox возвращает имена папок, но это то, что возвращает код? Очень смущенный.
Привет. Извините за отсутствие ясности. Поскольку список заполняется при загрузке, он покажет текущее состояние папок. Это может быть Xfolder1, folder2, xfolder3 и т. д. Это будут имена папок, существующие в настоящее время.
Другой способ взглянуть на это.
Выбор папок удалит любой префикс из всех выбранных при нажатии кнопки отправки. Невыбор папок добавит префикс ко всем невыбранным при нажатии кнопки отправки.
Если xfolder1 появляется в списке и выбран, он становится folder1. Если xfolder1 появляется в списке и НЕ выбран, он остается xfolder1. Если папка1 появляется в списке и выбрана, она остается папкой1. Если папка1 появляется в списке, но НЕ выбрана, она изменяется на xfolder1
Я надеюсь, что это имеет больше смысла?
На самом деле, я только что перечитал второй фрагмент кода и теперь думаю, что происходит что-то еще. Похоже, что ListBox
отображает фактические имена подпапок для одной папки, а затем, когда щелкается Button
, вы хотите переключить префикс для этих выбранных папок в другом месте, т.е. добавить префикс, если он не существует, и удалить его если это так. Это верно?
добавили разъяснения, надеюсь, в качестве редактирования, поскольку комментарии ограничены
папки остаются в той же папке. Будут последующие операции, которые будут игнорировать любые папки с префиксом X. Таким образом, список служит трем целям: он возвращает все папки, определяет, имеют ли они префикс X или нет, и позволяет выбирать. У тех выбранных, у которых есть префикс X, префикс будет удален. Ко всем невыбранным будет добавлен префикс X (переименование папки), поэтому их можно не учитывать. Все это происходит при отправке.
Предполагая, что я правильно понимаю ваш вопрос, я бы посоветовал вам использовать класс DirectoryInfo
. Вы можете создать один для родительской папки, а затем получить массив для подпапок. Затем вы можете привязать этот массив к ListBox
и отобразить свойство Name
, которое является просто именем папки, при этом имея доступ к свойству FullName
, которое является полным путем. У него также есть свойство Exists
и метод MoveTo
для переименования. Вот как бы я сделал то, о чем вы просите:
Imports System.IO
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim folderPath = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test")
Dim folder As New DirectoryInfo(folderPath)
Dim subFolders = folder.GetDirectories()
With ListBox1
.DisplayMember = "Name"
.DataSource = subFolders
End With
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Const prefix As String = "X"
For Each selectedSubFolder As DirectoryInfo In ListBox1.SelectedItems
'This is required to update the Exists property if the folder has been deleted since loading.
selectedSubFolder.Refresh()
If selectedSubFolder.Exists Then
Dim parentFolderPath = selectedSubFolder.Parent.FullName
Dim folderName = selectedSubFolder.Name
If folderName.StartsWith(prefix) Then
folderName = folderName.Substring(prefix.Length)
Else
folderName = prefix & folderName
End If
Dim folderPath = Path.Combine(parentFolderPath, folderName)
selectedSubFolder.MoveTo(folderPath)
End If
Next
End Sub
End Class
Обратите внимание, что это не обновляет ListBox
как есть. Если вы тоже этого хотите, вот как я бы это сделал с добавлением BindingSource
:
Imports System.IO
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim folderPath = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test")
Dim folder As New DirectoryInfo(folderPath)
Dim subFolders = folder.GetDirectories()
BindingSource1.DataSource = subFolders
With ListBox1
.DisplayMember = "Name"
.DataSource = BindingSource1
End With
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Const prefix As String = "X"
For Each selectedSubFolder As DirectoryInfo In ListBox1.SelectedItems
'This is required to update the Exists property if the folder has been deleted since loading.
selectedSubFolder.Refresh()
If selectedSubFolder.Exists Then
Dim parentFolderPath = selectedSubFolder.Parent.FullName
Dim folderName = selectedSubFolder.Name
If folderName.StartsWith(prefix) Then
folderName = folderName.Substring(prefix.Length)
Else
folderName = prefix & folderName
End If
Dim folderPath = Path.Combine(parentFolderPath, folderName)
selectedSubFolder.MoveTo(folderPath)
End If
Next
BindingSource1.ResetBindings(False)
End Sub
End Class
Обратите внимание, что это все равно не будет обрабатывать данные, но я оставлю это вам, если вы этого хотите. Причина в том, что вы можете выполнить простую сортировку массива DirectoryInfo
на Name
, но это будет прямая сортировка по алфавиту, которую ListBox
уже может делать. Если вам нужна логическая сортировка, как в File Explorer, где фактические числа в именах папок сортируются численно, вам также необходимо использовать функцию Windows APi, которая выходит за рамки этого вопроса. Если вы хотите, см. здесь для получения дополнительной информации.
спасибо за вашу помощь, я понимаю, что забыл указать, если listbox.items(i).selected тогда, поэтому, если выбрана xfolder, переименуйте папку, удалив x. если выбрана папка без префикса x, оставить как есть. Все невыбранные помечаются х. У всех выбранных удален x (при условии, что у них был один)
@SpanishLearner2Learner, я обновил свой ответ примерами кода.
Спасибо. Я получаю сообщение об ошибке во время выполнения (компилируется нормально). Необработанное исключение. Переменная объекта или с переменной блока не установлена. У меня была ошибка компилятора, которая была исправлена с помощью Private ReadOnly BindingSource1 As Object, и я изменил путь на свой собственный. Всплывающее окно с ошибкой, форма загружается, но без заполнения списка.
@SpanishLearner2Learner, нет смысла объявлять переменную Object
самостоятельно. Вам нужен настоящий BindingSource
, который вы добавите в форму в дизайнере так же, как и другие элементы управления и компоненты.
Это фантастика. Большое спасибо! Сначала я подумал, что под bindingsource вы имеете в виду источник данных для listbox1, а затем я перечитал ваш комментарий и понял, что это элемент управления, с которым я никогда не сталкивался. Вы, сэр, джентльмен и ученый! Ваше здоровье
@SpanishLearner2Learner, для протокола, BindingSource
— это компонент, а не элемент управления. Элемент управления наследует класс Control
, а BindingSource
— нет. Компоненты могут быть использованы в дизайнере, например. Timer
и Process
. Элементы управления являются специализированными компонентами. Предполагается, что BindingSource
является единой точкой контакта для связанных данных, позволяя вам в большинстве случаев избегать как источника данных, так и пользовательского интерфейса, а также объединяя функциональные возможности из других мест, таких как CurrencyManager
.
Ваш вопрос довольно запутанный. Вы говорите, что хотите отображать имена папок с префиксом в
ListBox
, а затем переименовывать фактическую папку, чтобы добавить префикс для выбранных, когда пользователь нажимаетButton
? Если так, вы пытаетесь переименовать папки в их исходном местоположении или в другом месте?