かを設定するOpenFileDialogを選択フォルダ?
-
09-06-2019 - |
質問
にVS.純場合、選択フォルダをプロジェクト、ダイアログが見えるようにOpenFileDialogはSaveFileDialogが表示され、設定ができるだけフォルダの中に別のフォルダを作以来、私は見たことん知りたいと思い方法で行われます。そのFolderBrowserDialogがんになっているのが好きるダイアログを表示します。でもなう活かしていることができる。
私はほぼ一定のようであるないないということです。純していると思うだんかいからポコードします。の完全に再実装のダイアログからだの変更ダイアログにおいて本的に振る舞えるのでしょうか?
また、言うまでのFolderBrowserDialogもんので、好奇心にかの設定ダイアログにそうである。聞かせていただきましても利用FolderBrowserDialogを維持で一貫したUIの経験がない満足感なカウントとしての答えです。
なVista-具体的なことではこのダイアログからVS.純2003年で可Win2kとWinXP.この"知りたい、正しいこと"問題のある、"私には関心をこめたいと思いしていますのでVSは2003年の"質問です。理解しているVistaのファイルダイアログのオプションこのためには、それXPでよく知っていた 何か を得られます。ビスタ特有の回答はない回答ので、眺望は存在しないのか。
更新:私はスコットの受け入れWisniewskiの回答が付属しているので、作業サンプルで、思サージあることを指摘し、ダイアログのカスタマイズは確かに避けます。純で は 仕事やマークの身代金のためのコーヒーに飽きたら寿司にとMSと思ロカスタムダイアログが表示されます。
解決
私はダイアログに書いたというOpenFileOrFolderダイアログへのこだわのいずれかのフォルダやファイルです。
設定した場合、そのAcceptFiles値がfalseの場合は、その営みを受け入れフォルダーモードになります。
他のヒント
あのWindows APIのコードパックです。で多くのシェル関連も含め、 CommonOpenFileDialog
クラスの Microsoft.WindowsAPICodePack.Dialogs
名前空間).この最適なソリューションは通常通り開く"ダイアログとフォルダを表示します。
ここでは一例ですので、使い方を:
CommonOpenFileDialog cofd = new CommonOpenFileDialog();
cofd.IsFolderPicker = true;
cofd.ShowDialog();
残念ながらMicrosoftな船舶このパッケージには、数人の内をアップバイナリをNuGet.その一例です こちらの.このパッケージには、シェルの固有のもの。が必要とするときに、同じユーザー数その他のパッケージを提供する機能が存在しオリジナルパッケージ。
利用できる FolderBrowserDialogEx - 再利用可能な誘導体に内蔵FolderBrowserDialog.ことができるタイプの道も、UNCパスです。でも閲覧のためのコンピュータやプリンターです。作品のようにFBDですが---ります。
(編集:いといけないことを指摘このダイアログで設定を選択ファイルやフォルダの中に別のフォルダを作)
フル-ソースコード、C#のモジュール)です。無料です。MS-公開ライセンスです。
コードを利用す:
var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
dlg1.Description = "Select a folder to extract to:";
dlg1.ShowNewFolderButton = true;
dlg1.ShowEditBox = true;
//dlg1.NewStyle = false;
dlg1.SelectedPath = txtExtractDirectory.Text;
dlg1.ShowFullPathInEditBox = true;
dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;
// Show the FolderBrowserDialog.
DialogResult result = dlg1.ShowDialog();
if (result == DialogResult.OK)
{
txtExtractDirectory.Text = dlg1.SelectedPath;
}
の Ookii.ダイアログ パッケージにはラッパー管理の新ビスタ-スタイル)のフォルダのブラウザダイアログを表示します。また低優雅に古いシステムです。
- Ookiiダイアログコンポーネントのラインナップ に的を絞った.NET4.5 ごNuGet
- OokiiダイアログのためのWindows Forms に的を絞った.NET4.5 ごNuGet
を利用しFolderBrowserDialog。
using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
dlg.Description = "Select a folder";
if (dlg.ShowDialog() == DialogResult.OK)
{
MessageBox.Show("You selected: " + dlg.SelectedPath);
}
}
のか この答え による leetNightShade へ ワーキ液.
んはもっとわからないであろうと思い作りこのソリューションのほうが良いのです。
- シンプルです。 でき上がりファイルを組み合わせには一辺)にあり、お客様のプロジェクト.
- その時の標準 FolderBrowserDialog の場合はXP以上のシステム。
- 著者から許可をコードの利用を目的にすると判断です。
ありませんライセンスとしてなどは自由ですので、そのコードに何をさせていただきます。
ダウンロードコード こちらの.
正確なオーディオのコピー 作品はこのように行わないものとします。標準のファイルを開く"ダイアログを表示するようにし、そのファイル名のフィールドにテキスト"ファイル名は無視されます".
う推測がないかの文字列を注入し、コンボボックスに編集制御で毎時間の大幅な変更が行われた、ダイアログを表示します。とのない空白のダイアログにフラグを設定しないの存在をチェックのファイルのダイアログを閉じることができる。
編集: これがどうしても必要であるが、超えているのだと思っていた。こちらのコードをC++/MFCできるので、環境ます。
CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();
編集2: この翻訳にスレッドセーフで、C#、ありませんが堪能なクライアントまで、フルのC#な撮影の場合はうまくいきませんでした。
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = "Filename will be ignored";
openFileDialog1.CheckPathExists = true;
openFileDialog1.ShowReadOnly = false;
openFileDialog1.ReadOnlyChecked = true;
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
// openFileDialog1.FileName should contain the folder and a dummy filename
}
編集3: 最後に見て、実際のダイアログ、Visual Studio2005(なかったアクセスです。 ではない標準のファイルを開く"ダイアログ! 場合を点検していまwindowsパ++と比較してみてください標準のファイルのオープンだが、構造とクラス名と一致しません.ときに見ることもできスポットの一部の差異の内容をダイ私の結論であるとのマイクロソフト社の完全に置換の標準ダイアログのVisual Studioです。もうすると取得できませんが、あるコードはご自身のゼロから立ち上げました。
OKい接続の最初のドット;-) 遊びっとスパイ++やWinspectorのフォルダのテキストボックスのVSプロジェクトの位置はカスタマイズの標準ダイアログを表示します。な専門分野のファイル名のテキストボックス標準のファイルダイアログなどのメモ帳です。
からある、とうもろこしなどを図VS隠しファイル名とfiletype textboxes/ックス用カスタムダイアログテンプレートの追加、独自の部分下部のダイアログを表示します。
編集:この例のようなカスタマイズというので(Win32.いません。純):
m_ofnのOPENFILENAME structべきファイルダイアログを表示します。追加これらの2つのライン:
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_IMPORTXLIFF);
m_ofn.Flags |= OFN_ENABLETEMPLATE;
がIDD_FILEDIALOG_IMPORTXLIFFカスタムダイアログテンプレートが追加され、下のダイアログを表示します。の部分に赤います。
(出典: apptranslator.com)
この場合、カスタマイズ部分はラベルを+、ハイパーリンクできる他のダイアログを表示します。これでOKボタンというフォルダのみを検証す。
がどういうものをコントロール標準のダイアログで、わかりません。
より詳細に このMSDNの記事.
できるサブクラスのファイルダイアログにアクセスすることによって、すべての制御できます。それぞれ別できる識別子の取得に使用され、その画面ます。きの表示と非表示を切り替えて、メッセージの中からつ選択の変更等など。ようにいくら努力したいです。
しかし我々の使WTL支援授業およびカスタマイズのファイルダイアログなどのカスタムの場所とバーがプラグイン-COMます。
MSDN る方法についての情報を提供いことを利用Win32, このCodeProject記の例, は、 このCodeProjectとができます。a.純例.
利用できるようにします
- のフィルタを隠すファイル
- ファイル名は隠し最初のテキスト
先進の非表示のテキストボックスのためのファイル名を見ていく必要がある
OpenFileDialogEx
コード:
{
openFileDialog2.FileName = "\r";
openFileDialog1.Filter = "folders|*.neverseenthisfile";
openFileDialog1.CheckFileExists = false;
openFileDialog1.CheckPathExists = false;
}
思いのwindows Vistaを使用VS2008?その場合はいると思うの FOS_PICKFOLDERSオプション 使用時の呼び出しのビスタファイルダイアログ IFileDialog.私た。純コードは、以下の通り比較的簡単ですがたっぷりのgnarly P/呼び出しinteropコードを取得します。
第一ソリューション
私はこのたび開発したとして清掃版 .純勝7-スタイルのフォルダ選択ダイアログ ビSeddonの lyquidity.com してくれてありがとうございます,所属なし).(私のコードから 他の答えをこのページ).に書いた自分で解決が必要な反射のクラスだけるように、必要なこ集目的、利用の例外に基づくフローコントロールなキャッシュに、その成果を反射されます。なお、入れ子の静的 VistaDialog
クラスは、その静的変数の反射いずれの場合 Show
方法は呼び出されます。で、Vistaダイアログをしない場合は十分高いWindowsのバージョン。はWindows7,8,9,10以上(理論).
using System;
using System.Reflection;
using System.Windows.Forms;
namespace ErikE.Shuriken {
/// <summary>
/// Present the Windows Vista-style open file dialog to select a folder. Fall back for older Windows Versions
/// </summary>
public class FolderSelectDialog {
private string _initialDirectory;
private string _title;
private string _fileName = "";
public string InitialDirectory {
get { return string.IsNullOrEmpty(_initialDirectory) ? Environment.CurrentDirectory : _initialDirectory; }
set { _initialDirectory = value; }
}
public string Title {
get { return _title ?? "Select a folder"; }
set { _title = value; }
}
public string FileName { get { return _fileName; } }
public bool Show() { return Show(IntPtr.Zero); }
/// <param name="hWndOwner">Handle of the control or window to be the parent of the file dialog</param>
/// <returns>true if the user clicks OK</returns>
public bool Show(IntPtr hWndOwner) {
var result = Environment.OSVersion.Version.Major >= 6
? VistaDialog.Show(hWndOwner, InitialDirectory, Title)
: ShowXpDialog(hWndOwner, InitialDirectory, Title);
_fileName = result.FileName;
return result.Result;
}
private struct ShowDialogResult {
public bool Result { get; set; }
public string FileName { get; set; }
}
private static ShowDialogResult ShowXpDialog(IntPtr ownerHandle, string initialDirectory, string title) {
var folderBrowserDialog = new FolderBrowserDialog {
Description = title,
SelectedPath = initialDirectory,
ShowNewFolderButton = false
};
var dialogResult = new ShowDialogResult();
if (folderBrowserDialog.ShowDialog(new WindowWrapper(ownerHandle)) == DialogResult.OK) {
dialogResult.Result = true;
dialogResult.FileName = folderBrowserDialog.SelectedPath;
}
return dialogResult;
}
private static class VistaDialog {
private const string c_foldersFilter = "Folders|\n";
private const BindingFlags c_flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
private readonly static Assembly s_windowsFormsAssembly = typeof(FileDialog).Assembly;
private readonly static Type s_iFileDialogType = s_windowsFormsAssembly.GetType("System.Windows.Forms.FileDialogNative+IFileDialog");
private readonly static MethodInfo s_createVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("CreateVistaDialog", c_flags);
private readonly static MethodInfo s_onBeforeVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("OnBeforeVistaDialog", c_flags);
private readonly static MethodInfo s_getOptionsMethodInfo = typeof(FileDialog).GetMethod("GetOptions", c_flags);
private readonly static MethodInfo s_setOptionsMethodInfo = s_iFileDialogType.GetMethod("SetOptions", c_flags);
private readonly static uint s_fosPickFoldersBitFlag = (uint) s_windowsFormsAssembly
.GetType("System.Windows.Forms.FileDialogNative+FOS")
.GetField("FOS_PICKFOLDERS")
.GetValue(null);
private readonly static ConstructorInfo s_vistaDialogEventsConstructorInfo = s_windowsFormsAssembly
.GetType("System.Windows.Forms.FileDialog+VistaDialogEvents")
.GetConstructor(c_flags, null, new[] { typeof(FileDialog) }, null);
private readonly static MethodInfo s_adviseMethodInfo = s_iFileDialogType.GetMethod("Advise");
private readonly static MethodInfo s_unAdviseMethodInfo = s_iFileDialogType.GetMethod("Unadvise");
private readonly static MethodInfo s_showMethodInfo = s_iFileDialogType.GetMethod("Show");
public static ShowDialogResult Show(IntPtr ownerHandle, string initialDirectory, string title) {
var openFileDialog = new OpenFileDialog {
AddExtension = false,
CheckFileExists = false,
DereferenceLinks = true,
Filter = c_foldersFilter,
InitialDirectory = initialDirectory,
Multiselect = false,
Title = title
};
var iFileDialog = s_createVistaDialogMethodInfo.Invoke(openFileDialog, new object[] { });
s_onBeforeVistaDialogMethodInfo.Invoke(openFileDialog, new[] { iFileDialog });
s_setOptionsMethodInfo.Invoke(iFileDialog, new object[] { (uint) s_getOptionsMethodInfo.Invoke(openFileDialog, new object[] { }) | s_fosPickFoldersBitFlag });
var adviseParametersWithOutputConnectionToken = new[] { s_vistaDialogEventsConstructorInfo.Invoke(new object[] { openFileDialog }), 0U };
s_adviseMethodInfo.Invoke(iFileDialog, adviseParametersWithOutputConnectionToken);
try {
int retVal = (int) s_showMethodInfo.Invoke(iFileDialog, new object[] { ownerHandle });
return new ShowDialogResult {
Result = retVal == 0,
FileName = openFileDialog.FileName
};
}
finally {
s_unAdviseMethodInfo.Invoke(iFileDialog, new[] { adviseParametersWithOutputConnectionToken[1] });
}
}
}
// Wrap an IWin32Window around an IntPtr
private class WindowWrapper : IWin32Window {
private readonly IntPtr _handle;
public WindowWrapper(IntPtr handle) { _handle = handle; }
public IntPtr Handle { get { return _handle; } }
}
}
}
このように使用しているWindowsフォーム:
var dialog = new FolderSelectDialog {
InitialDirectory = musicFolderTextBox.Text,
Title = "Select a folder to import music from"
};
if (dialog.Show(Handle)) {
musicFolderTextBox.Text = dialog.FileName;
}
もちろんの遊びとそのオプションとどのプロパティで公開.例えば、multiselectでは、Vista-スタイルダイアログを表示します。
第二ソリューション
サイモンMourierた答え る方法を示しない同じ仕事をinteropのWindows APIを直接ものの、彼の版がれの古いスタイルダイアログの場合よりも古いバージョンのosはWindowsです。残念ながらなかったのがメールアドレスを入力してみてくださいった自溶液とする。名毒!
うから Codeproject 信用リスクをNitron):
だと思っているのと同じダイアログでいつもいる場合にスクリーンショット?
bool GetFolder(std::string& folderpath, const char* szCaption=NULL, HWND hOwner=NULL)
{
bool retVal = false;
// The BROWSEINFO struct tells the shell how it should display the dialog.
BROWSEINFO bi;
memset(&bi, 0, sizeof(bi));
bi.ulFlags = BIF_USENEWUI;
bi.hwndOwner = hOwner;
bi.lpszTitle = szCaption;
// must call this if using BIF_USENEWUI
::OleInitialize(NULL);
// Show the dialog and get the itemIDList for the selected folder.
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
if(pIDL != NULL)
{
// Create a buffer to store the path, then get the path.
char buffer[_MAX_PATH] = {'\0'};
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
{
// Set the string value.
folderpath = buffer;
retVal = true;
}
// free the item id list
CoTaskMemFree(pIDL);
}
::OleUninitialize();
return retVal;
}
Windows Vistaでの利用 IFileDialog とFOS_PICKFOLDERSオプションセットです。その原因となりま表示OpenFileDialogようなウィンドウを選択できますフォルダ:
var frm = (IFileDialog)(new FileOpenDialogRCW());
uint options;
frm.GetOptions(out options);
options |= FOS_PICKFOLDERS;
frm.SetOptions(options);
if (frm.Show(owner.Handle) == S_OK) {
IShellItem shellItem;
frm.GetResult(out shellItem);
IntPtr pszString;
shellItem.GetDisplayName(SIGDN_FILESYSPATH, out pszString);
this.Folder = Marshal.PtrToStringAuto(pszString);
}
年齢によりWindowsできーリゾートトリックの選定に任意のファイルフォルダにまとめた。
作例でおります。NET Framework2.0以降で こちらの.
利用できるようにします
フィルターは空の文字列が返されます。ファイル名はAnyNameがない空白
openFileDialog.FileName = "AnyFile";
openFileDialog.Filter = string.Empty;
openFileDialog.CheckFileExists = false;
openFileDialog.CheckPathExists = false;
ピックアップしました。うした設定 OpenFileDialog
ものを見ることGoogleを持ちましては指摘の場合のみフォルダすべき使用 FolderBrowserDialog
代わりとしての回答をさせていただきもので質問以下