.net - फ़ोल्डर का चयन करने के लिए आप OpenFileDialog को कैसे कॉन्फ़िगर करते हैं?




windows winapi (11)

वीएस .NET में, जब आप किसी प्रोजेक्ट के लिए फ़ोल्डर का चयन कर रहे होते हैं, तो एक संवाद जो OpenFileDialog या SaveFileDialog जैसा दिखता है प्रदर्शित होता है, लेकिन केवल फ़ोल्डरों को स्वीकार करने के लिए सेट किया जाता है। जब से मैंने इसे देखा है, मैं जानना चाहता हूं कि यह कैसे किया जाता है। मैं FolderBrowserDialog से अवगत हूं, लेकिन मुझे कभी भी उस संवाद को पसंद नहीं आया है। यह बहुत छोटा शुरू होता है और मुझे पथ टाइप करने में सक्षम होने का लाभ नहीं देता है।

मैं अब तक निश्चित हूं कि .NET से ऐसा करने का कोई तरीका नहीं है, लेकिन मैं बस उत्सुक हूं कि आप इसे अप्रबंधित कोड से कैसे करते हैं। स्क्रैच से संवाद को पूरी तरह से कार्यान्वित करने का छोटा, आप इस व्यवहार के लिए संवाद को कैसे संशोधित करते हैं?

मैं यह भी कहना चाहूंगा कि मैं फ़ोल्डर ब्राउजर डियालॉग से अवगत हूं लेकिन कभी-कभी मैं इस तरह से एक संवाद को कॉन्फ़िगर करने के लिए वास्तव में उत्सुक होने के अलावा इसका उपयोग करना पसंद नहीं करता हूं। मुझे फ़ोल्डर ब्राउजर डायलॉग का उपयोग करने के लिए कहने में मुझे लगातार यूआई अनुभव बनाए रखने में मदद मिलती है लेकिन मेरी जिज्ञासा को पूरा नहीं करता है, इसलिए यह एक जवाब के रूप में नहीं गिना जाएगा।

यह एक Vista-विशिष्ट बात नहीं है; मैं वीएस .NET 2003 के बाद से यह संवाद देख रहा हूं, इसलिए यह Win2k और WinXP में करने योग्य है। यह "मैं ऐसा करने का उचित तरीका जानना चाहता हूं" प्रश्न से कम है और "मैं इस बारे में उत्सुक हूं क्योंकि मैं इसे पहले वीएस 2003 में करना चाहता था" प्रश्न। मैं समझता हूं कि विस्टा के फ़ाइल संवाद में ऐसा करने का विकल्प है, लेकिन यह XP में काम कर रहा है, इसलिए मुझे पता है कि उन्होंने इसे काम करने के लिए कुछ किया है । विस्टा-विशिष्ट उत्तर उत्तर नहीं हैं, क्योंकि Vista संदर्भ प्रश्न में मौजूद नहीं है।

अपडेट करें: मैं स्कॉट विस्निविस्की के जवाब को स्वीकार कर रहा हूं क्योंकि यह एक कामकाजी नमूना के साथ आता है, लेकिन मुझे लगता है कि सर्ज संवाद अनुकूलन को इंगित करने के लिए क्रेडिट का हकदार है (जो कि .NET से स्वीकार्य रूप से बुरा है लेकिन यह काम करता है ) और मार्क रांससम को यह पता लगाने के लिए कि एमएस शायद इस कार्य के लिए एक कस्टम संवाद लुढ़का।


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);
}

पुराने विंडोज़ के लिए आप फ़ोल्डर में किसी भी फाइल को चुनने के साथ हमेशा चाल का सहारा ले सकते हैं।

कार्य उदाहरण जो .NET Framework 2.0 पर काम करता है और बाद में here पाया जा सकता here


आप FolderBrowserDialogEx उपयोग कर सकते हैं - FolderBrowserDialogEx पुनः उपयोग करने योग्य व्युत्पन्न। यह आपको एक पथ में टाइप करने की अनुमति देता है, यहां तक ​​कि एक यूएनसी पथ भी। आप कंप्यूटर या प्रिंटर के साथ भी ब्राउज़ कर सकते हैं। अंतर्निहित एफबीडी की तरह काम करता है, लेकिन ... बेहतर।

(संपादित करें: मुझे यह इंगित करना चाहिए था कि यह संवाद फ़ाइलों या फ़ोल्डरों का चयन करने के लिए सेट किया जा सकता है।)

पूर्ण स्रोत कोड (एक छोटा सी # मॉड्यूल)। मुक्त। एमएस-पब्लिक लाइसेंस।

इसका उपयोग करने के लिए कोड:

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;
}

आप इस तरह के कोड का उपयोग कर सकते हैं

  • फ़िल्टर छिपी हुई फाइलें हैं
  • फ़ाइल नाम पहले पाठ छुपा है

फ़ाइल नाम के लिए टेक्स्टबॉक्स के उन्नत छिपाने के लिए आपको OpenFileDialogEx को देखने की आवश्यकता है

कोड:

{
    openFileDialog2.FileName = "\r";
    openFileDialog1.Filter = "folders|*.neverseenthisfile";
    openFileDialog1.CheckFileExists = false;
    openFileDialog1.CheckPathExists = false;
}

आप फ़ाइल संवाद को उपclass कर सकते हैं और इसके सभी नियंत्रणों तक पहुंच प्राप्त कर सकते हैं। प्रत्येक में एक पहचानकर्ता होता है जिसका उपयोग विंडो विंडो हैंडल प्राप्त करने के लिए किया जा सकता है। फिर आप उन्हें दिखा सकते हैं और छुपा सकते हैं, चयन परिवर्तन आदि के बारे में संदेश प्राप्त कर सकते हैं। यह सब निर्भर करता है कि आप कितना प्रयास करना चाहते हैं।

हमने डब्ल्यूटीएल क्लास सपोर्ट का उपयोग करके किया और कस्टम स्पेस बार और प्लग-इन COM विचारों को शामिल करने के लिए फ़ाइल संवाद को अनुकूलित किया।

MSDN Win32 का उपयोग करके इसे कैसे करें इस बारे में जानकारी प्रदान करता है, इस कोडप्रोजेक्ट आलेख में एक उदाहरण शामिल है , और यह कोडप्रोजेक्ट आलेख एक .NET उदाहरण प्रदान करता है


कोडप्रोजेक्ट (नाइट्रॉन को क्रेडिट) से इसे आजमाएं:

मुझे लगता है कि यह वही संवाद है जिसके बारे में आप बात कर रहे हैं - शायद यदि आप स्क्रीनशॉट जोड़ते हैं तो इससे मदद मिलेगी?

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;
}

खोज के घंटों के बाद मुझे यह जवाब leetNightShade द्वारा एक कामकाजी समाधान में मिला

तीन चीजें हैं जो मुझे विश्वास है कि इस समाधान को अन्य सभी की तुलना में बेहतर बनाते हैं।

  1. इसका उपयोग करना आसान है। यह केवल आपके प्रोजेक्ट में दो फाइलें शामिल करता है (जिसे किसी भी रूप में जोड़ा जा सकता है)।
  2. XP या पुराने सिस्टम पर उपयोग किए जाने पर यह मानक FolderBrowserDialog पर वापस आ जाता है।
  3. लेखक किसी भी उद्देश्य के लिए कोड का उपयोग करने की अनुमति देता है जिसे आप फिट मानते हैं।

    आपके पास कोई लाइसेंस नहीं है जैसे आप कोड के साथ लेने और करने के लिए स्वतंत्र हैं।

यहां कोड डाउनलोड करें


मुझे पता है कि यह सवाल OpenFileDialog कॉन्फ़िगरेशन पर था, लेकिन यह देखते हुए कि Google ने मुझे यहां लाया है, मैं यह भी FolderBrowserDialog सकता हूं कि यदि आप केवल फ़ोल्डर्स की तलाश में हैं तो आपको फ़ोल्डर्स FolderBrowserDialog का उपयोग करना चाहिए, जैसा कि नीचे एक और SO प्रश्न द्वारा उत्तर दिया गया है

Vb.net में खुले फ़ाइल संवाद का उपयोग कर पथ निर्दिष्ट कैसे करें?


मुझे लगता है कि आप Vista पर VS2008 का उपयोग कर रहे हैं? उस स्थिति में मुझे लगता है कि Vista फ़ाइल संवाद IFileDialog कॉल करते समय FOS_PICKFOLDERS विकल्प का उपयोग किया जा रहा है। मुझे डर है कि .NET कोड में इसमें काम करने के लिए बहुत सारे gnarly पी / Invoc इंटरऑप कोड शामिल होगा।


सटीक ऑडियो कॉपी विंडोज एक्सपी पर इस तरह से काम करता है। मानक फ़ाइल खुला संवाद दिखाया गया है, लेकिन फ़ाइल नाम फ़ील्ड में "फ़ाइल नाम अनदेखा किया जाएगा" टेक्स्ट शामिल है।

बस अनुमान लगा रहा है, लेकिन मुझे संदेह है कि स्ट्रिंग को कॉम्बो बॉक्स में इंजेक्शन दिया जाता है जब भी संवाद में महत्वपूर्ण परिवर्तन किया जाता है। जब तक क्षेत्र खाली नहीं होता है, और संवाद झंडे फ़ाइल के अस्तित्व की जांच न करने के लिए सेट होते हैं, तो संवाद सामान्य रूप से बंद किया जा सकता है।

संपादित करें: मैंने सोचा जितना आसान है। यहां सी ++ / एमएफसी में कोड है, आप इसे अपनी पसंद के माहौल में अनुवाद कर सकते हैं।

CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();

संपादित करें 2: यह सी # का अनुवाद होना चाहिए, लेकिन मैं सी # में धाराप्रवाह नहीं हूं इसलिए अगर यह काम नहीं करता है तो मुझे शूट न करें।

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: अंत में विजुअल स्टूडियो 2005 में प्रश्न में वास्तविक संवाद को देखा (मुझे पहले इसकी पहुंच नहीं थी)। यह मानक फ़ाइल खुला संवाद नहीं है! यदि आप जासूस ++ में विंडो का निरीक्षण करते हैं और उन्हें एक मानक फ़ाइल के साथ तुलना करते हैं, तो आप देखेंगे कि संरचना और वर्ग के नाम मेल नहीं खाते हैं। जब आप बारीकी से देखते हैं, तो आप संवाद की सामग्री के बीच कुछ अंतर भी खोज सकते हैं। मेरा निष्कर्ष यह है कि माइक्रोसॉफ्ट ने इसे इस क्षमता को देने के लिए विजुअल स्टूडियो में मानक संवाद को पूरी तरह से बदल दिया है। मेरा समाधान या कुछ ऐसा ही होगा जितना आप प्राप्त कर सकते हैं, जब तक कि आप खुद को स्क्रैच से कोड करने के इच्छुक नहीं हैं।


Ookii.Dialogs पैकेज में नए (Vista-style) फ़ोल्डर ब्राउज़र संवाद के चारों ओर एक प्रबंधित रैपर होता है। यह पुराने ऑपरेटिंग सिस्टम पर भी गहराई से घटता है।


विंडोज एपीआई कोड पैक है। इसमें CommonOpenFileDialog क्लास ( Microsoft.WindowsAPICodePack.DialogsCommonOpenFileDialog नेमस्पेस) सहित कई शैल संबंधित सामान हैं। यह एकदम सही समाधान है - केवल प्रदर्शित फ़ोल्डर्स के साथ सामान्य खुला संवाद।

यहां इसका उपयोग करने का एक उदाहरण दिया गया है:

CommonOpenFileDialog cofd = new CommonOpenFileDialog();
cofd.IsFolderPicker = true;
cofd.ShowDialog();

दुर्भाग्यवश माइक्रोसॉफ्ट अब इस पैकेज को शिप नहीं करता है, लेकिन कई लोगों ने NuGet को अनौपचारिक रूप से अपलोड की गई द्विआधारी हैं। एक उदाहरण here पाया जा सकता here । यह पैकेज केवल शैल-विशिष्ट सामान है। यदि आपको इसकी आवश्यकता हो, तो उसी उपयोगकर्ता के पास कई अन्य पैकेज हैं जो मूल पैकेज में अधिक कार्यक्षमता प्रदान करते हैं।





openfiledialog