0

次のコードは、ロード時に実行され、ディレクトリからファイル名を取得します

Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Dim lynxin As New IO.DirectoryInfo(sPath)
  lstPlanned.Items.Clear()
  For Each txtfi In lynxin.GetFiles("*.txt")
    lstPlanned.Items.Add(IO.Path.GetFileNameWithoutExtension(txtfi.Name)) 'filename only
  Next
End Sub

私が望むのは、上記のように(拡張子なしで)情報を引き戻すことですが、ファイルを開く必要がある場合は、リストボックス内の項目をダブルクリックする機能があります。に変更できることはわかっていますlstPlanned.Items.Add(IO.Path.GetFileNameWithoutExtension(txtfi.Name))lstPlanned.Items.Add(IO.Path.GetFile(txtfi.Name))、プロセスは機能しますが、ファイル拡張子を表示したくありません。テキストの解析と置換のどちらを検討すべきかわかりません。

4

3 に答える 3

1

ValueMember()、DisplayMember()、および LINQ を使用した WinForms に対する Lisa-Berlin の回答が気に入りましたが、いくつかのエラーがあります。これは、選択が行われた後に ListBox の SelectedValue() メンバーを使用する方法も示す、よりクリーンな例です。

Public Class Main

    Private spath = "C:\Users\Mike\Documents"

    Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Files = (From file In System.IO.Directory.GetFiles(spath, "*.txt")
                     Select New With {
                         .FullName = file,
                         .FileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(file)}
                     ).ToList

        lstPlanned.ValueMember = "FullName"
        lstPlanned.DisplayMember = "FileNameWithoutExtension"
        lstPlanned.DataSource = Files
    End Sub

    Private Sub lstPlanned_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lstPlanned.SelectedIndexChanged
        If lstPlanned.SelectedIndex <> -1 Then
            Label1.Text = lstPlanned.SelectedValue.ToString
        End If
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If lstPlanned.SelectedIndex <> -1 Then
            Process.Start(lstPlanned.SelectedValue.ToString)
        End If
    End Sub

End Class
于 2013-11-15T15:29:34.863 に答える
1

これはハンスが言及していたことです:

Class Element
   Public ItemName As String = ""
   Public ItemData As Object = Nothing

   Public Sub New(n As String, d as object)
       ItemName = n
       ItemData = d
   End Sub

   Public Sub New()
   End Sub

   Public Overrides Function ToString() As String
      Return ItemName
   End Sub
 End Class

使用するには:

   For Each fi as in lynxin.GetFiles("*.txt")
         ' create an element, what you want to display is first arg
         ' second it the data to store
         Dim El AS New Element(Path.GetFileNameWithoutExtension(fi.Name),
               fi.Name)
         lstbox.add(El)
   Next

データにアクセスするための構文は次のとおりです。

   console.WriteLine("file: {0}   fullname: {1}", _
        lstBox.Items(N).ItemName,  lstBox.Items(N).ItemData) 

lstBox.Items単純な文字列ではなく、要素オブジェクトを参照します。基になるデータを取得するには、Element メンバーを使用して修飾しlstBox.Items(N).ItemNameます。この場合、Ext なしのファイル名を返します (Nはダミー変数です)。.ItemDataこの場合は、完全なファイル名になります。

そのような小さなクラスを多くの同様の状況に使用できます

于 2013-11-15T13:29:48.710 に答える