いつもちょっと疑問に思うこと。FilterIndex の指定がなんかへん。なんで 1 からなんだ?なんで 0 を指定しても 1 と同じ動きすんだ?
名前のせいなのか、勘違いされやすいのが RestoreDirectory。
# 追記(ワタシも勘違いしてました...orz)
# コメント及びコメント欄を参照ください。
一応書いておくと、たとえば InitialDirectory を デスクトップにしたとします。
そんで ユーザーがボタンを押すなどして OpenFileDialog.ShowDialog した後に、
ユーザーが \...\デスクトップ\ふじこ\ひるね フォルダに移動して、
ユーザーが \...\デスクトップ\ふじこ\ひるね\あくび.TXT を選択して [開く]を押下します。
一回目の操作はコレで終わり。
二回目、ユーザーが再度ボタンを押すなどして OpenFileDialog.ShowDialog した時、
InitialDirectory の デスクトップでなくて、\...\デスクトップ\ふじこ\ひるね を開く
というだけのもの。
# ↑ これは、FileName プロパティによるものだそうです。
# FileName に 値がセットしてある場合、InitialDirectory は無視され、初期ディレクトリは FileName のファイルがあるディレクトリになるそうです。
# RestoreDirectory = False は、System.Environment.CurrentDirectory が 上記例だと \...\デスクトップ\ふじこ\ひるね になり、
# RestoreDirectory = True は CurrentDirectory はいったん変わるものの、ShowDialog から抜けると CurrentDirectory の元の値を復帰します。
削除しても復元してくれるとかそんなんじゃないす。
■参考文献
OpenFileDialog クラス
OpenFileDialog コンポーネント (Windows フォーム)
■実行画像
ごてごてな OpenFileDialog
Public Class OpenFileDialogTest
Private Sub OpenFileDialogTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With Me.OpenFileDialog1
' 既定:True
.AddExtension = True
' 存在しないファイルを指定した場合に警告を出す(既定:True)
.CheckFileExists = True
' 存在しないパスを指定した場合に警告を出す(既定:True)
.CheckPathExists = True
' 拡張子が指定されない場合の既定の拡張子を指定
.DefaultExt = "txt"
' ショートカットを指定した場合、ショートカット自体を選択するか
' 実体を選択するかを指定(既定:True)
.DereferenceLinks = True
' 選択されているファイル名
.FileName = ""
' [ファイルの種類] ボックスに表示される選択肢
.Filter = "テキスト(*.txt)|*.txt|イメージ(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png|ふじこえでん(*.fujiko.eden)|*.fujiko.eden"
' Filter でいくつか指定した時にどれを最初に表示するか(これだとイメージが表示)
.FilterIndex = 2
' 既定で選択されてるディレクトリ
.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
' 複数選択を許可するか否かの指定(既定:False)
.Multiselect = False
' [読み取り専用ファイルとして開く]チェックボックスを表示するか否か(既定:False)
.ShowReadOnly = True
' [読み取り専用ファイルとして開く]チェックボックスのチェックの状態(既定:False)
.ReadOnlyChecked = True
' Environment.CurrentDirectory をユーザーが指定した場所に変更するか否か(既定:False)
.RestoreDirectory = True
' ヘルプボタンを表示するか否か(既定:False)
.ShowHelp = True
' ダイアログ ボックスが複数のファイル名拡張子をを受け入れるか否か(既定:False)
' Filter で指定した *.fujiko.eden で、hoge.fujiko.eden の拡張子を .eden とするか .fujiko.eden とするか
.SupportMultiDottedExtensions = True
' タイトル
.Title = "ふぁいるをしていしてね"
' 有効な Win32 ファイル名だけを受け入れるかどうか(既定:True)
.ValidateNames = True
End With
End Sub
Private Sub OpenFileDialogTest_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
' Form をダブルクリックして OpenFileDialog を開く
Dim result As DialogResult = Me.OpenFileDialog1.ShowDialog(Me)
End Sub
' OpenFileDialog で 開くボタン押下時
Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
Dim filePath As String = Me.OpenFileDialog1.FileName
Dim ext As String = System.IO.Path.GetExtension(filePath).ToLower()
Dim st As System.IO.Stream = Me.OpenFileDialog1.OpenFile()
Me.ClearControls()
Dim sz As Size = New Size(250, 250)
Dim lc As Point = New Point(10, 10)
If ext.Contains("bmp") OrElse ext.Contains("jpg") OrElse ext.Contains("png") Then
' 画像だったら PictureBox に表示
Dim pic As PictureBox = New PictureBox()
pic.Size = sz
pic.SizeMode = PictureBoxSizeMode.Zoom
pic.Location = lc
pic.Image = Bitmap.FromStream(st)
Me.Controls.Add(pic)
Else
' 画像以外だったら TextBox に表示
Dim txt As TextBox = New TextBox()
txt.Multiline = True
txt.ScrollBars = ScrollBars.Both
txt.Size = sz
txt.Location = lc
txt.Text = New System.IO.StreamReader(st, System.Text.Encoding.Default).ReadToEnd
Me.Controls.Add(txt)
End If
End Sub
' OpenFileDialog で ヘルプボタン押下時
Private Sub OpenFileDialog1_HelpRequest(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenFileDialog1.HelpRequest
Dim ofd As OpenFileDialog = DirectCast(sender, OpenFileDialog)
MessageBox.Show(ofd.Title) ' OpenFileDialog の Title をメッセージ表示
End Sub
Private Sub ClearControls()
For Each ctrl As Control In Me.Controls
Me.Controls.Remove(ctrl)
ctrl.Dispose()
Next
End Sub
End Class