tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルOpenFileDialog のmultiselectの取り扱い
記事No7190
投稿日: 2008/03/11(Tue) 18:13
投稿者ひでと
コードで予め複数のファイル名を設定して、OpenFileDialogを開きたいと思っています。
OpenFileDialogのFileNamesを利用したいと考えましたがFileNames(0)="test.txt"
の様なわけにはいかないようです。
FileNameプロパティにファイル名を連結した文字列を設定しようとしましたが
これも Ret = OpenFileDialog1.ShowDialog()とすると「有効なファイル名ではありません」
というエラーがでます。どのようにすればよいのでしょうか?
試験用にデスクトップに
"2008年4月給与.kyo" "2008年2月給与.kyo" "2008年3月給与.kyo"
のファイルを作っています。以下は試したコードです。よろしくお願いします。


Public Class Form1
    Dim DirName As String = "C:\Documents and Settings\ひでと\デスクトップ"
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ret As DialogResult
        Dim i As Integer
        Dim FileNameStr As String
        Dim FileNameStr2 As String
        Dim dum As String = ""

        OpenFileDialog1.Multiselect = True
        For i = 0 To 11
            FileNameStr2 = CStr(Now.Year) & "年" & i + 1 & "月給与.kyo"
            FileNameStr = DirName & "\" & FileNameStr2
            If System.IO.File.Exists(FileNameStr) Then
                dum = dum & """" & FileNameStr2 & """" & " "
            End If
        Next
        OpenFileDialog1.FileName = RTrim(dum)
        Debug.Print(dum)
        '"2008年4月給与.kyo" "2008年2月給与.kyo" "2008年3月給与.kyo" 出力結果です
        Ret = OpenFileDialog1.ShowDialog() 'ここでエラーがでます
        If Ret = Windows.Forms.DialogResult.OK Then

        Else
            Exit Sub
        End If
    End Sub
End Class

[ツリー表示へ]
タイトルRe: OpenFileDialog のmultiselectの取り扱い
記事No7191
投稿日: 2008/03/11(Tue) 18:27
投稿者ゆうき
ゆうきです。

> 「有効なファイル名ではありません」
まさかこんなことではないでしょうね。
http://msdn2.microsoft.com/ja-jp/library/6f69bkd1(vs.80).aspx

[ツリー表示へ]
タイトルRe: OpenFileDialog のmultiselectの取り扱い
記事No7192
投稿日: 2008/03/11(Tue) 19:13
投稿者花ちゃん
>         OpenFileDialog1.FileName = RTrim(dum)

FileName プロパティ は、1個のファイル名しか使用できません。(ヘルプ参照)
(従って " がフィル名に含まれる為にエラーとなる)
複数のファイルを取得する場合は、FileNames プロパティ です。
(こちらは、取得のみで設定はできません)

そもそも、前もって書き込んでもそのファイルが選択される訳ではないので、
何の役にも立たないように思うのですが。

まだ、下記の方が便利なような気がしますが。
.Filter = "(2008年)|2008年*.kyo"

[ツリー表示へ]
タイトルRe^2: OpenFileDialog のmultiselectの取り扱い
記事No7194
投稿日: 2008/03/12(Wed) 09:07
投稿者ひでと
ありがとうございます。
>
> FileName プロパティ は、1個のファイル名しか使用できません。(ヘルプ参照)
> (従って " がフィル名に含まれる為にエラーとなる)
> 複数のファイルを取得する場合は、FileNames プロパティ です。
> (こちらは、取得のみで設定はできません)
出来ないのですね。FileNameをコードで指定しないでダイアログを表示し
複数を選択するとFileNameのボックスのところに複数のファイル名が表示されたので
できると思っていました。

>
> そもそも、前もって書き込んでもそのファイルが選択される訳ではないので、
> 何の役にも立たないように思うのですが。
OKボタンだけ押せば選択できるので、やってみようと思ったのです。

>
> まだ、下記の方が便利なような気がしますが。
> .Filter = "(2008年)|2008年*.kyo"

Filterで表示を限定して、選択しやすいようにするわけですね。
こちらの方法を試してみます。ありがとうございました。

[ツリー表示へ]
タイトルRe^3: OpenFileDialog のmultiselectの取り扱い
記事No7196
投稿日: 2008/03/12(Wed) 11:05
投稿者花ちゃん
> OKボタンだけ押せば選択できるので、やってみようと思ったのです。

それなら、OpenFileDialog を使わなくてもメッセージボックスで十分では、
メッセージボックス で OK の場合は、そのファイル名を使用し、 NO の場合は
OpenFileDialog を表示するようにすれば。

[ツリー表示へ]
タイトルRe^4: OpenFileDialog のmultiselectの取り扱い
記事No7197
投稿日: 2008/03/12(Wed) 16:17
投稿者ひでと
ありがとうございます。
> > OKボタンだけ押せば選択できるので、やってみようと思ったのです。
>
> それなら、OpenFileDialog を使わなくてもメッセージボックスで十分では、
> メッセージボックス で OK の場合は、そのファイル名を使用し、 NO の場合は
> OpenFileDialog を表示するようにすれば。

同様の方法でしょうがチェックボックスのtagを使って予めファイルを
取得する方法で実現できました。
年末調整用に給与、賞与を取得するプログラムの一部になります。
コードとしては 以下になりました。
     Dim myFNames As New List(Of String)
   Private Sub ファイル名取得()
        myFNames.Clear()
        Dim Con As New Control
        Dim ChkBox As New CheckBox
        Dim i As Integer
        For Each Con In Me.Controls
            If TypeOf Con Is CheckBox Then
                ChkBox = Con
                Select Case ChkBox.Tag
                    Case "冬季", "夏季"
                        If ChkBox.Checked = True Then
                            myFNames.Add(社員.賞与DirName & "\" & ChkBox.Text)
                        End If
                    Case Else
                        If ChkBox.Checked = True Then
                            myFNames.Add(社員.給与DirName & "\" & ChkBox.Text)
                        End If
                End Select
            End If
        Next
        For i = 0 To Me.lb追加ファイル.Items.Count - 1
            myFNames.Add(Me.lb追加ファイル.Items(i))
        Next
    End Sub
    Private Sub 年末調整_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim Con As New Control
        Dim ChkBox As New CheckBox
        For Each Con In Me.Controls
            If TypeOf Con Is CheckBox Then
                ChkBox = Con
                Select Case ChkBox.Tag
                    Case "冬季", "夏季"
                        ChkBox.Text = CStr(Now.Year) & "年" & ChkBox.Tag & "賞与.syo"
                        If System.IO.File.Exists(社員.賞与DirName & "\" & ChkBox.Text) Then
                            ChkBox.Checked = True
                        Else
                            ChkBox.Checked = False
                        End If
                    Case Else
                        ChkBox.Text = CStr(Now.Year) & "年" & ChkBox.Tag & "月給与.kyo"
                        If System.IO.File.Exists(社員.給与DirName & "\" & ChkBox.Text) Then
                            ChkBox.Checked = True
                        Else
                            ChkBox.Checked = False
                        End If
                End Select
                If ChkBox.Checked = True Then
                    ChkBox.Enabled = True
                Else
                    ChkBox.Enabled = False
                End If
            End If
        Next
    End Sub

    Private Sub bファイルの追加_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bファイルの追加.Click
        Dim Ret As DialogResult
        Dim i As Integer
        opd年末調整.Filter = "給与ファイル(*.kyo)|*.kyo|賞与ファイル(*.syo)|*.syo"
        Ret = opd年末調整.ShowDialog()
        If Ret = Windows.Forms.DialogResult.OK Then
            For i = 0 To opd年末調整.FileNames.GetUpperBound(0)
                lb追加ファイル.Items.Add(opd年末調整.FileNames(i))
            Next
        Else
            Exit Sub
        End If
    End Sub

    Private Sub b追加ファイルのクリア_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles b追加ファイルのクリア.Click
        Me.lb追加ファイル.Items.Clear()
    End Sub
ありがとうございました。

[ツリー表示へ]