ফোল্ডারগুলি নির্বাচন করতে আপনি কীভাবে একটি ওপেন ফাইলডায়লগ কনফিগার করবেন?


250

ভিএস। নেট এ, আপনি যখন কোনও প্রকল্পের জন্য একটি ফোল্ডার নির্বাচন করছেন, তখন কোনও ওপেনফিলডায়ালগ বা সেভফাইলডায়ালগের মতো দেখায় এমন একটি ডায়ালগ প্রদর্শিত হয়, তবে কেবলমাত্র ফোল্ডার গ্রহণ করার জন্য সেটআপ করা হয়। আমি যখন এটি দেখেছি তখন থেকেই আমি এটি জানতে পেরেছিলাম। আমি ফোল্ডার ব্রাউজার ডায়ালগ সম্পর্কে সচেতন, কিন্তু আমি সত্যিই কখনই সেই ডায়লগটি পছন্দ করি নি। এটি খুব ছোট শুরু হয় এবং আমাকে কোনও পথ টাইপ করতে সক্ষম হওয়ার সুবিধা নিতে দেয় না।

আমি এখনই প্রায় নিশ্চিত হয়েছি। নেট থেকে এটি করার কোনও উপায় নেই, তবে আপনি নিয়ন্ত্রণহীন কোড থেকেও এটি কীভাবে করেন তা আমি ঠিক কৌতূহলী। স্ক্র্যাচ থেকে ডায়ালগটি সম্পূর্ণরূপে পুনর্নির্মাণের সংক্ষেপে, আপনি এই আচরণটি করার জন্য ডায়ালগটি কীভাবে সংশোধন করবেন?

আমি আবারও বলতে চাই যে আমি ফোল্ডার ব্রাউজার ডায়ালগ সম্পর্কে সচেতন তবে কখনও কখনও ডায়ালগটি কীভাবে কনফিগার করতে হয় তা সম্পর্কে সত্যই আগ্রহী হওয়ার পাশাপাশি আমি এটি ব্যবহার করতে পছন্দ করি না। আমাকে কেবল ফোল্ডার ব্রাউজারডায়ালগটি ব্যবহার করতে বলার সাথে সাথে আমি একটি সুসংগত ইউআই অভিজ্ঞতা বজায় রাখতে সহায়তা করি তবে আমার কৌতূহলকে সন্তুষ্ট করে না তাই এটি কোনও উত্তর হিসাবে গণ্য হবে না।

এটি কোনও ভিস্তা-নির্দিষ্ট জিনিস নয়; VS .NET 2003 সাল থেকে আমি এই ডায়ালগটি দেখছি, তাই এটি উইন 2 কে এবং উইনএক্সপিতে করণীয়। এটি একটি "আমি এই পদ্ধতিটি করার সঠিক উপায়টি জানতে চাই" এর চেয়ে কম এবং একটি "ভিএস 2003 এর প্রথম প্রশ্নটি করার আগে থেকেই আমি এটি সম্পর্কে আগ্রহী ছিলাম"। আমি বুঝতে পারি যে ভিস্তার ফাইল ডায়লগের কাছে এটি করার একটি বিকল্প রয়েছে তবে এটি এক্সপিতে কাজ করছে তাই আমি জানি তারা এটির কাজটি করার জন্য তারা কিছু করেছিল। ভিস্তা-নির্দিষ্ট উত্তরগুলির উত্তর নয়, কারণ প্রশ্ন প্রসঙ্গে ভিস্তার উপস্থিতি নেই।

আপডেট করুন: আমি স্কট Wisniewski এর উত্তর গ্রহণ করছি কারণ এটি একটি কাজ নমুনা সাথে আসে, কিন্তু আমি সার্জ ডায়ালগ স্বনির্ধারণ নির্দেশিত জন্য ক্রেডিট দাবী মনে (যা .NET থেকে বোঝা যাচ্ছে যে নেতারা কদর্য কিন্তু এটা করে কর্মস্থল) এবং মার্ক মুক্তিপণ figuring আউট যে মাইক্রোসফট জন্য সম্ভবত এই কাজের জন্য একটি কাস্টম ডায়ালগ ঘূর্ণিত।


7
কোডেপ্রজেক্ট কোডপ্রজেক্ট / আর্টিকেলস / 9৪৯১৪/২ থেকে কেবল একটি সহজ সমাধান [ফাইল এবং ফোল্ডার উভয়ই বাছাই করতে ওপেনফাইলডিলোগ পাওয়ার মূল চাবিকাঠিটি ValidateNames এবং CheckFileExists বৈশিষ্ট্যগুলি মিথ্যাতে সেট করা (ডায়ালগ.ভালিডেটনেমস = মিথ্যা; ডায়লগ.চেকফিলএক্সজিস্ট = মিথ্যা) এবং ফোল্ডার নির্বাচন করা হয়েছে কিনা তা নিশ্চিত করার জন্য ফাইলনেমকে কিছু বিশেষ কীওয়ার্ডে সেট করুন (ডায়ালগ। ফাইল ফাইল = "ফোল্ডার নির্বাচন";)]]
রিজু

3
এটি একটি উত্তর হিসাবে জমা দিন, এটি আমার প্রকল্পের কাজ করেছে।
সিগারডুগ

@Riju হয় dialog.FileName = "Folder Selection"হতে অনুমিত dialog.FileName = "Folder Selection."চিহ্ন সময়ের সাথে? যাইহোক আমি যেভাবেই "ওপেন" এর দ্বিতীয় ক্লিকটিতে পাওয়ারশেলের কাজ করতে পারি না। এটি ফাইলটি খুঁজে পাওয়া যায়নি, যদিও চেকফিলএক্সজিস্টগুলি মিথ্যা বলে মনে করা হচ্ছে
কমরেডজোকল

এনভিএম dialog.CheckFileExists = 0, মিথ্যা পরিবর্তে পাওয়ারসেল সেটিংয়ে আমার সমস্যার সমাধান করেছে
কমরেড জোকুল 10:38

উত্তর:


57

আমার একটি ডায়লগ রয়েছে যা আমি লিখেছিলাম একটি ওপেনফাইআলফোর্ডার ডায়ালগ যা আপনাকে ফোল্ডার বা একটি ফাইল খোলার অনুমতি দেয়।

যদি আপনি এর অ্যাকসেপ্টফাইস মানকে মিথ্যাতে সেট করে থাকেন তবে তা কেবল গ্রহণযোগ্য ফোল্ডার মোডে চালিত হয়।

আপনি এখানে গিটহাব থেকে উত্সটি ডাউনলোড করতে পারেন


4
খুব আকর্ষণীয় এবং স্পষ্টভাবে জটিল হিসাবে আমি অনুমেয় ছিল। এটি বর্ণনা করার কোনও উপায় এবং এটি কী করে তা নির্দেশ করে? এটি অন্যান্য মন্তব্যের পাশাপাশি আমাকে বিশ্বাস করতে পরিচালিত করে এমএস সম্ভবত তাদের নিজস্ব ডায়ালগটি ঘুরিয়েছে।
OwenP

1
আপনার সমাধানটি তৈরি করার চেষ্টা করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি ... দুর্ভাগ্যক্রমে আমার শক্তির একটিতে সি ++ নেই ... ত্রুটি 1 খুলতে পারে না ফাইল 'afxres.h' অন্তর্ভুক্ত।
ইগনাসিও সৌর গার্সিয়া

1
@ সোমোস, এবং একই সমস্যা সহ অন্যরা: ফাইলটিতে উইন্ডোজফর্মস অ্যাপ্লিকেশন 1.csproj 100 লাইনে সম্পাদনা করুন যাতে এটি আপনার সেটআপের সাথে মেলে। আমার ক্ষেত্রে আমাকে "9.0" "10.0" (দুবার) এ পরিবর্তন করতে হয়েছিল এবং "(x86)" (দুবার) মুছে ফেলতে হয়েছিল।
রেনিপিট

2
আমি কোড (জিপ) ডাউনলোড করেছি এবং .h (সি) ফাইলটি খুঁজে পেয়েছি এবং ত্রুটি দিয়ে সংকলিত করেছি যেমন 'সাল.এইচ' ফাইল অন্তর্ভুক্ত করতে পারে না।
লেই ইয়াং

2
এই সমাধানটি VS2010 এবং VS2017 তেও কাজ করে না!
আলেএক্স_

49

আপনি ফোল্ডার ব্রাউজারডায়ালগএক্স ব্যবহার করতে পারেন - বিল্ট-ইন ফোল্ডার ব্রাউজারডায়ালগের পুনরায় ব্যবহারযোগ্য ডেরাইভেটিভ। এটি আপনাকে কোনও পাথ এমনকি ইউএনসি পাথ টাইপ করতে দেয়। আপনি এটির সাথে কম্পিউটার বা প্রিন্টারগুলির জন্যও ব্রাউজ করতে পারেন। বিল্ট-ইন এফবিডি এর মতো কাজ করে তবে ... আরও ভাল।

(সম্পাদনা: আমার এই বিষয়টি উল্লেখ করা উচিত ছিল যে এই ডায়ালগটি ফাইল বা ফোল্ডার নির্বাচন করতে সেট করা যেতে পারে))

সম্পূর্ণ উত্স কোড (একটি সংক্ষিপ্ত সি # মডিউল)। বিনামূল্যে। এমএস-পাবলিক লাইসেন্স।

এটি ব্যবহারের কোড:

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

7
দুঃখিত যদি আমি অসন্তুষ্ট হয়ে যাই তবে কোন প্রশ্ন জিজ্ঞাসা করা এবং "আমি এই নির্দিষ্ট জিনিসটি চাই, অন্য বিষয়গুলি চাই না" এই বানানটি হতাশার সাথে এবং লোকেরা আনন্দের সাথে অনুরোধ না করা বিষয়টির পরামর্শ দেয়। আমি একটি ফাইল ব্রাউজার ডায়ালগ চেয়েছিলাম, কোনও ফোল্ডার ব্রাউজার ডায়ালগ নয়।
OwenP

15
প্রশ্নটি যেভাবে বলা হচ্ছে, তা আমার কাছে মনে হচ্ছে এটি কোনও ফোল্ডার চয়নকারী ডায়ালগের জন্য জিজ্ঞাসা করছে - এটি কি তাই না? যাইহোক, আমি ঠিক এটিই +1
টিম

অবশ্যই এখন পর্যন্ত সেরা উত্তর
ভাসিল পপভ

1
এটি সত্যটি পরিবর্তন করে না, উত্তরটি এখনও একটি লিঙ্ক-একমাত্র উত্তর। কোনও সাইট-অফ রিসোর্সে হোস্ট করা কোডটি কীভাবে ব্যবহার করা যায় তা দেখানো সহায়ক হতে বন্ধ করে দেয়, যখন সেই লিঙ্কটিও অস্থায়ীভাবে বা স্থায়ীভাবে অনুপলব্ধ হয়ে যায়। নিয়মগুলি কোনও কারণে রয়েছে এবং এই অবদানগুলি এই নিয়মের সাথে সাংঘর্ষিক।
IInspectable

1
আমি এই উত্তরের দিকে নজর দিয়েছি এবং এটি দৃশ্যত কোনও অফ-সাইট সংস্থার উল্লেখ করে না। সুতরাং "অন্য প্রতিটি উত্তর" স্পষ্টতই ভুল। আপনি যদি মনে করেন যে আমি অত্যধিক আচরণ করছি, নিয়মগুলি নিয়ে আলোচনা করার জন্য আপনার হয়তো মেটাতে কোনও সমস্যা উত্থাপন করা উচিত। আমি করব না। আমি কেবল সেগুলি প্রয়োগ করব।
০১:১:

48

উইন্ডোজ এপিআই কোড প্যাক রয়েছে। এটি CommonOpenFileDialogক্লাস সহ অনেকগুলি শেল সম্পর্কিত জিনিস পেয়েছে ( Microsoft.WindowsAPICodePack.Dialogsনেমস্পেসে)। এটি হ'ল নিখুঁত সমাধান the

এটি কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

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

দুর্ভাগ্যক্রমে মাইক্রোসফ্ট আর এই প্যাকেজটি জাহাজে রাখে না, তবে বেশিরভাগ লোক বেসরকারীভাবে নিউগেটে বাইনারি আপলোড করে। একটি উদাহরণ এখানে পাওয়া যাবে । এই প্যাকেজটি কেবল শেল-নির্দিষ্ট স্টাফ। আপনার যদি এটির দরকার হয় তবে একই ব্যবহারকারীর বেশ কয়েকটি অন্যান্য প্যাকেজ রয়েছে যা মূল প্যাকেজে উপস্থিত আরও কার্যকারিতা সরবরাহ করে।


1
আমি জানতাম না যে এটি উইন্ডোজ এপিআই কোড প্যাকটিতে রয়েছে - এটি নির্দেশ করার জন্য ধন্যবাদ।
প্যাট্রিক ক্লুগ

10
কমনওপেনফিলডায়ালগ ক্লাসটি কেবল উইন্ডোজ ভিস্তা বা তারপরেই বিদ্যমান রয়েছে, তাই পুরানো অপারেটিং সিস্টেমে একটি ব্যতিক্রম ছুঁড়ে ফেলবে
রাচেল

1
আপনি দয়া করে কীভাবে উইন্ডোজ এপিআই কোড প্যাকটি উল্লেখ করতে পারেন?
জেফ

1
সংরক্ষণাগার গ্যালারী অবসর নেওয়া হয়েছে। , বা লিঙ্ক বলছেন তাই .. গেল এই জন্য নতুন স্থান হতে পারে?
ডিফল্ট

3
যাইহোক, কমনওপেনফিলডায়ালগ ক্লাসটি মাইক্রোসফ্টে রয়েছে W উইন্ডোজএপিকোডপ্যাক। ডায়ালগস নেমস্পেস (এটি খুঁজতে আমার কিছুটা সময় লেগেছে)।
মর্গব

35

Ookii.Dialogs প্যাকেজ নতুন (ভিস্তা ধাঁচের) প্রায় একটি পরিচালিত মোড়কের ব্রাউজার ডায়ালগ ফোল্ডারের ধারণ করে। এটি পুরানো অপারেটিং সিস্টেমগুলিতে করুণভাবে হ্রাস করে।


2
দুর্দান্ত, এটি বিএসডি-স্টাইল-লাইসেন্সযুক্ত ওপেন সোর্স!
রোমান স্টারকভ

7
একমাত্র সমস্যাটি হল, আমি আমাকে লক্ষ্য হিসাবে নেট ফ্রেমওয়ার্ক ক্লায়েন্ট প্রোফাইল ব্যবহার করতে দেব না।
কুগেল

2
খুব সুন্দর সমাধান। এটি আমার দৃষ্টিতে সেরা উত্তর। ঠিক আমি যা 3 বছর ধরে অনুসন্ধান করেছিলাম।
স্যামুয়েল

1
এই সমাধানের সাথে আর একটি সমস্যা: এটি ব্যবহারকারীর অস্তিত্বহীন পথে আটকানোর অনুমতি দেয় না। একটি অপ্রাপ্তবয়স্ক, তুলনামূলকভাবে, কিন্তু এখনও একটি করুণা।
রোমান স্টারকভ

1
যারা স্টাইল ফোল্ডার ডায়ালগ চান তাদের জন্য সেরা ব্যবহারিক উত্তর answer OpenFileDialog
জল 1

27

তার জন্য ফোল্ডার ব্রাউজারডায়ালগ ব্যবহার করা আরও ভাল।

using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
    dlg.Description = "Select a folder";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show("You selected: " + dlg.SelectedPath);
    }
}

9
আমি সচেতন যে একটি ফোল্ডার ব্রাউজারডায়ালগ ব্যবহার করা ভাল । আমি কৌতূহলী যে এটি নির্বিশেষে কীভাবে করা হয়েছিল। ফোল্ডার ব্রাউজারডায়ালগ বিভিন্নভাবেই দুর্গন্ধযুক্ত; এমনকি ভিস্তাতেও এর জায়গাগুলি বার নেই। মজাদার কীভাবে এটি এমএস করা ভাল তা এ পর্যন্ত 3 ভিএস সংস্করণে এড়ানো হয়েছে।
OwenP

24
ফোল্ডার ব্রাউজারডায়ালগের অনেকগুলি ব্যবহারযোগ্যতার সমস্যা রয়েছে। আমি আসলে এটি কোনও প্রয়োগে রাখার বিষয়টি বিবেচনা করব না। একটি ডায়লগের জন্য আমার পোস্টটি দেখুন যা আরও ভাল ব্যবহারযোগ্যতা পেয়েছে
স্কট উইসনিউইস্কি

6
ফোল্ডার ব্রাউজারডায়ালগ এটিকে অনুমতি দেয় না: - নীচের অংশে পাঠ্য ক্ষেত্রে পুরো পাথ টাইপ করুন / আটকান - ভিস্তার উপর "প্রিয় লিঙ্কগুলি" বারটি ব্যবহার করুন
ডেস্কটেলজউ 19:38-এ

89
ফোল্ডার ব্রাউজার ডায়ালগটি ইউআইয়ের সত্যিকারের একটি ভয়ঙ্কর বিট।
ম্যাকেনির

32
গুরুতরভাবে, লোকেরা, দয়া করে আপনার অ্যাপ্লিকেশনগুলিতে এই বিরক্তিকর ডায়ালগটি স্থাপন করা বন্ধ করুন। এটিতে পূর্বের মন্তব্যে হাইলাইট করা হিসাবে খুব BAD UI রয়েছে।
রোমান স্টারকভ

23

ঘন্টাখানেক অনুসন্ধানের পরে আমি এই উত্তরটি একটি কার্যনির্বাহী সমাধানের জন্য লেটনাটশেডের মাধ্যমে পেয়েছি

আমি বিশ্বাস করি যে তিনটি জিনিস এই সমাধানটিকে অন্য সকলের তুলনায় অনেক ভাল করে তোলে।

  1. এটি ব্যবহার করা সহজ। এটির জন্য আপনার প্রকল্পে কেবল দুটি ফাইল অন্তর্ভুক্ত করা উচিত (যা যে কোনওভাবেই একত্রিত হতে পারে)।
  2. এক্সপি বা পুরানো সিস্টেমে ব্যবহৃত হলে এটি স্ট্যান্ডার্ড ফোল্ডার ব্রাউজার ডায়ালগের কাছে ফিরে আসে ।
  3. আপনি উপযুক্ত মনে করেন কোনও উদ্দেশ্যে লেখক কোডটি ব্যবহারের অনুমতি দিয়েছেন।

    আপনি যা করতে চান কোডটি নিতে এবং করতে নিখরচায় কোনও লাইসেন্স নেই।

কোডটি এখানে ডাউনলোড করুন


@ ম্যাটডাভিস: আমি নিশ্চিত করেছি যে এটি। নেট ফ্রেমওয়ার্ক 4.0 (স্ট্যান্ডার্ড এবং ক্লায়েন্ট প্রোফাইল উভয়) তে কাজ করে। আপনার প্রকল্পে ফোল্ডারসিলিটডায়ালগ.সি এবং রিফ্লেক্টর সি উভয়ই যুক্ত হয়েছে তা নিশ্চিত করুন। যদিও একটা জিনিস ... আপনি উইন্ডোজ 8 এ চালাচ্ছেন? আমি একটি উইন 7 কম্পিউটারে পরীক্ষা করেছি।
অ্যালেক্স এসিলফি

@ অ্যালেক্স এসিলফি, আপনি সঠিক বলেছেন। আমার প্রকল্পে এটি টানতে আমি অবশ্যই কিছু ভুল করেছি। আমি আমার আগের মন্তব্যটি পরিষ্কার করার জন্য মুছে ফেলব।
ম্যাট ডেভিস

একাধিক বিকল্পের মধ্যে দৌড়াতে এবং এটিকে সেরা মনে করা। সুপারিশ।
Jaded

আমার জন্য উইন্ডোজ 10 এ কাজ করেছেন। ভাল সহজ সমাধান
ডেভিড উইল্টন

পুরানো সিস্টেমে ব্যর্থতাকে সম্মান করতে হবে
মাইক এম

17

এক্সট্যাক্ট অডিও কপি উইন্ডোজ এক্সপিতে এইভাবে কাজ করে। স্ট্যান্ডার্ড ফাইল ওপেন ডায়ালগ দেখানো হয়েছে তবে ফাইলের নাম ক্ষেত্রটিতে "ফাইলের নাম উপেক্ষা করা হবে" লেখা রয়েছে contains

এখানে কেবল অনুমান করেই, তবে আমি সন্দেহ করি যে ডায়ালগটিতে প্রতিবার একটি উল্লেখযোগ্য পরিবর্তন আনলে স্ট্রিংটি কম্বো বাক্স সম্পাদনা নিয়ন্ত্রণে ইনজেক্ট করা হয়। যতক্ষণ না ক্ষেত্রটি ফাঁকা নয়, এবং ডায়ালগ পতাকাগুলি ফাইলটির অস্তিত্ব পরীক্ষা করতে সেট করা আছে, ডায়ালগটি স্বাভাবিকভাবে বন্ধ করা যেতে পারে।

সম্পাদনা: এটি আমার ধারণা থেকে অনেক সহজ। সি ++ / এমএফসি-তে কোড এখানে রয়েছে, আপনি এটি আপনার পছন্দের পরিবেশে অনুবাদ করতে পারেন।

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-এ প্রশ্নে আসল সংলাপটি দেখেছি (আমার এটিতে আগে অ্যাক্সেস ছিল না)। এটি স্ট্যান্ডার্ড ফাইল ওপেন ডায়লগ নয়! আপনি যদি স্পাই ++ এ উইন্ডোগুলি পরিদর্শন করেন এবং তাদের খোলার স্ট্যান্ডার্ড ফাইলের সাথে তুলনা করেন, আপনি দেখতে পাবেন যে কাঠামো এবং শ্রেণীর নামগুলি মেলে না। আপনি ঘনিষ্ঠভাবে তাকান, আপনি ডায়ালগ বিষয়বস্তুর মধ্যে কিছু পার্থক্য স্পট করতে পারেন। আমার উপসংহারটি হ'ল মাইক্রোসফ্ট ভিজুয়াল স্টুডিওতে স্ট্যান্ডার্ড ডায়ালগটিকে পুরোপুরি প্রতিস্থাপনের জন্য এটির ক্ষমতা দিয়েছে। আপনি সমাধান থেকে নিজের কোড করতে ইচ্ছুক না হলে আমার সমাধান বা এর অনুরূপ কিছু আপনি যেমন পেতে পারেন ততই কাছাকাছি থাকবে।


17

ঠিক আছে, আমাকে প্রথম বিন্দুর সাথে সংযোগ করার চেষ্টা করতে দাও ;-) স্পাই ++ বা উইনস্প্যাক্টরের সাথে কিছুটা খেললে বোঝা যায় যে ভিএস প্রকল্পের অবস্থানের ফোল্ডার পাঠ্যবাক্সটি স্ট্যান্ডার্ড কথোপকথনের একটি অনুকূলিতকরণ। এটি নোটপ্যাডের মতো একটি স্ট্যান্ডার্ড ফাইল ডায়লগের ফাইল নাম পাঠ্যবক্সের মতো একই ক্ষেত্র নয়।

সেখান থেকে, আমি চিত্রিত করেছি, ভিএস ফাইলের নাম এবং ফাইল টাইপ পাঠ্যবাক্সগুলি / কম্বোবক্সগুলি আড়াল করে এবং ডায়ালগের নীচে নিজের অংশ যুক্ত করতে একটি কাস্টম ডায়ালগ টেম্পলেট ব্যবহার করে।

সম্পাদনা: এই জাতীয় কাস্টমাইজেশন এবং এটি কীভাবে করা যায় তার উদাহরণ এখানে রয়েছে (উইন 32 এ। নেট নয়):

m_ofn হল OPENFILENAME স্ট্রাক্ট যা ফাইল ডায়ালগটি অন্তর্ভুক্ত করে। এই 2 লাইন যুক্ত করুন:

  m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_IMPORTXLIFF);
  m_ofn.Flags |= OFN_ENABLETEMPLATE;

যেখানে আইডিডি_এফএলআইডিএলওজি_আইএমএপিটিএক্সএলআইএফএফ হ'ল একটি কাস্টম সংলাপ টেম্পলেট যা ডায়ালগের নীচে যুক্ত করা হবে। নীচে লাল অংশ দেখুন। (উত্স: apptranslator.com )বিকল্প পাঠ

এই ক্ষেত্রে, কাস্টমাইজ করা অংশটি কেবল একটি লেবেল + একটি হাইপারলিংক তবে এটি কোনও সংলাপ হতে পারে। এটিতে একটি ওকে বাটন থাকতে পারে যা আমাদের কেবল ফোল্ডার নির্বাচনকে বৈধতা দেয়।

তবে কীভাবে আমরা ডায়ালগের মানক অংশের কিছু নিয়ন্ত্রণ থেকে মুক্তি পাব, জানি না।

এই এমএসডিএন নিবন্ধে আরও বিশদ ।


1
এটি অতীতে আমি কিছু ব্যাখ্যা শুনেছি বলে মনে হয়, তবে আমি কখনও ধারণার কোনও প্রদর্শন দেখিনি। এমএসডিএন ডকুমেন্টেশনে কি এমন কি ওয়াকথ্রু রয়েছে?
OwenP

10

আপনি ফাইল ডায়লগ সাবক্লাস করতে পারেন এবং এর সমস্ত নিয়ন্ত্রণে অ্যাক্সেস পেতে পারেন। প্রত্যেকের একটি শনাক্তকারী রয়েছে যা এর উইন্ডো হ্যান্ডেলটি ব্যবহার করতে ব্যবহার করা যেতে পারে। তারপরে আপনি এগুলি দেখিয়ে এবং আড়াল করতে পারেন, বাছাই পরিবর্তনগুলি ইত্যাদি সম্পর্কে তাদের কাছ থেকে বার্তা পেতে পারেন etc. এগুলি নির্ভর করে যে আপনি কতটা প্রচেষ্টা নিতে চান।

আমরা আমাদের ডাব্লুটিএল ক্লাস সমর্থন ব্যবহার করে করেছি এবং একটি কাস্টম স্থান বার এবং প্লাগ-ইন সিওএম ভিউ অন্তর্ভুক্ত করতে ফাইল ডায়লগটি কাস্টমাইজ করেছি।

এমএসডিএন উইন 32 ব্যবহার করে এটি কীভাবে করা যায় সে সম্পর্কিত তথ্য সরবরাহ করে, এই কোডপ্রজেক্ট নিবন্ধটিতে একটি উদাহরণ রয়েছে এবং এই কোডপ্রজেক্ট নিবন্ধটি .NET উদাহরণ সরবরাহ করে


10

আপনি এই জাতীয় কোড ব্যবহার করতে পারেন

  • ফিল্টারটি হাইড ফাইলগুলি
  • ফাইলের নামটি হ'ল প্রথম পাঠ্য

ফাইলনামের জন্য পাঠ্যবাক্সের উন্নত আড়াল করতে আপনাকে ওপেনফায়ালডায়ালগএক্স দেখতে হবে

কোড:

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

উইন্ডোজ 7+ এর জন্য সহজ এবং আমার যা প্রয়োজন
হাও নুগেইন

এছাড়াও পতাকাগুলিতে OFN_NOVALIDATE প্রয়োজন
গব্লিন অ্যালকেমিস্ট

5

আমি ধরে নিয়েছি আপনি ভিএসটিতে ভিএস ২০০৮ ব্যবহার করছেন? সেক্ষেত্রে আমি ভাবি যে ভিস্তা ফাইল ডায়ালগ আইফাইলডায়ালগ কল করার সময় FOS_PICKFOLDERS বিকল্পটি ব্যবহৃত হচ্ছে । আমি আশঙ্কা করছি NET কোডে এতে প্রচুর পরিমাণে জেনারালি পি / ইনভোক ইন্টারপ কোড জড়িত থাকবে।


1
ভিস্তা-নির্দিষ্ট; আমি এটি প্রথম উইন্ডোজ এক্সপিতে ভিএস 2003 এ দেখেছি।
OwenP

2

প্রথম সমাধান

আমি লিকুইডিটি ডট কমের বিল সেডডনেরনেট উইন 7-স্টাইলের ফোল্ডার নির্বাচন সংলাপের ক্লিন আপ সংস্করণ হিসাবে এটি বিকাশ করেছি (আমার কোনও সম্পর্ক নেই)। (আমি এই পৃষ্ঠার অন্য উত্তর থেকে তার কোডটি শিখেছি )। আমি আমার নিজের লিখলাম কারণ তার সমাধানের জন্য অতিরিক্ত প্রতিবিম্ব শ্রেণীর প্রয়োজন যা এই কেন্দ্রিক উদ্দেশ্যে প্রয়োজন হয় না, ব্যতিক্রম-ভিত্তিক প্রবাহ নিয়ন্ত্রণ ব্যবহার করে, এর প্রতিবিম্ব কলগুলির ফলাফলগুলিকে ক্যাশে করে না। মনে রাখবেন যে নেস্টেড স্ট্যাটিক VistaDialogক্লাসটি যাতে এর স্ট্যাটিক প্রতিবিম্ব ভেরিয়েবলগুলি যদি Showপদ্ধতিটি কখনও কল না করা হয় তবে পপুলেশন হওয়ার চেষ্টা না করে । এটি যদি উচ্চ পর্যায়ে উইন্ডোজ সংস্করণে না থাকে তবে প্রাক-ভিস্তার প্রাক সংলাপে ফিরে আসে। উইন্ডোজ 7, ​​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; } }
        }
    }
}

এটি উইন্ডোজ ফর্মে যেমন ব্যবহার করা হয়:

var dialog = new FolderSelectDialog {
    InitialDirectory = musicFolderTextBox.Text,
    Title = "Select a folder to import music from"
};
if (dialog.Show(Handle)) {
    musicFolderTextBox.Text = dialog.FileName;
}

আপনি অবশ্যই এর বিকল্পগুলি এবং এটি কী কী বৈশিষ্ট্যগুলি প্রকাশ করে তা নিয়ে খেলা করতে পারেন। উদাহরণস্বরূপ, এটি ভিস্তা-স্টাইল সংলাপে মাল্টিসিলেটের অনুমতি দেয়।

দ্বিতীয় সমাধান

সাইমন মউরিয়ার একটি উত্তর দিয়েছেন যা উইন্ডোজ এপিআইয়ের বিরুদ্ধে সরাসরি ইন্টারপ ব্যবহার করে কীভাবে একই কাজটি করতে পারে তা দেখায়, যদিও উইন্ডোজের কোনও পুরানো সংস্করণে যদি তার সংস্করণটি পুরানো স্টাইলের ডায়ালগটি ব্যবহার করার জন্য পরিপূরক হতে হয়। দুর্ভাগ্যক্রমে, আমি আমার সমাধানটি কাজ করার পরে তার পোস্টটি এখনও পাইনি। আপনার বিষের নাম দিন!


এই সূক্ষ্ম কথোপকথনটিকে ডায়ালগ বক্স হিসাবে কল করার অনুরূপ ব্যবহারের উদাহরণ (যেমন কনসোল-টাইপ অ্যাপ্লিকেশনগুলি থেকে) খালি হ্যান্ডেল সহ: বাক্সের ঠিক বাইরে সংকলন করে: var ডায়ালগ = নতুন ফোল্ডারসিলিটডায়ালগ {ইনিশিয়াল ডাইরেক্টরি = "সি: \\", শিরোনাম = "একটি নির্বাচন করুন "} থেকে সংগীত আমদানি করতে ফোল্ডার; if (কথোপকথন.শো ()) {স্ট্রিং মাইফোর্ড = ডায়লগ.ফিলনাম; }
ফিল্ম

দ্রষ্টব্য: মন্তব্য হিসাবে আমার ব্যবহারের উদাহরণটি পড়তে অসুবিধা, অতএব: আসল ব্যবহারের সবচেয়ে গুরুত্বপূর্ণ পরিবর্তন "উদাহরণ": প্রাথমিক ডিরেক্টরি এবং শিরোনামের মধ্যে কমা ব্যবহার করুন ..
ফিল্ম

1

থেকে এই এক চেষ্টা Codeproject (নাইট্রনপদার্থ কৃতিত্ব):

আমি মনে করি এটি একই সংলাপের বিষয়ে আপনি কথা বলছেন - সম্ভবত আপনি যদি স্ক্রিনশট যুক্ত করেন তবে এটি সাহায্য করবে?

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

images.google.com/… অনিশ্চিত হলে গবেষণা করুন। আমি যা চেয়েছিলাম তা বর্ণনা করেছি এবং ফোল্ডার ব্রাউজারডায়ালগ উত্তর হিসাবে ইতিমধ্যে অযোগ্য ঘোষণা করা হয়েছে।
OwenP

"আমি ফোল্ডার ব্রাউজার ডায়ালগ সম্পর্কে সচেতন, কিন্তু আমি কখনই সেই ডায়লগটি সত্যই পছন্দ করতে পারি নি small এটি খুব ছোট শুরু হয় এবং আমাকে কোনও পথ টাইপ করতে সক্ষম হওয়ার সুযোগ নিতে দেয় না" " নিজে কিছু গবেষণা করুন - আপনি সেখানে কোনও পথ টাইপ করতে পারেন। যাইহোক আমি মনে করি এটি কিছুটা দ্বিধাগ্রস্থ প্রশ্ন, সুতরাং এটির জন্য শুভকামনা।
দৈত্যচোড়মনকি

@ ডিমনকোডমোনকি: আপনি পথের কোনও অংশে টাইপ করতে পারবেন না এবং তারপরে আপনার পছন্দসই লক্ষ্যটিতে নেভিগেট করতে পারবেন। ফাইল-ওপেনডায়ালগের বিকল্পগুলির মতো সুবিধাজনক নয়।
ট্রেব

1

Vista- তে আপনি ব্যবহার করতে পারেন IFileDialog FOS_PICKFOLDERS বিকল্প সেট দিয়ে। এটি ওপেনফায়ালডিয়ালগ-এর মতো উইন্ডো প্রদর্শনের কারণ করবে যেখানে আপনি ফোল্ডার নির্বাচন করতে পারেন:

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 ফ্রেমওয়ার্ক 2.0 এবং এর পরে কাজ করে এমন উদাহরণ এখানে পাওয়া যাবে


1

আপনি এই জাতীয় কোড ব্যবহার করতে পারেন

ফিল্টারটি খালি স্ট্রিং। ফাইলের নামটি কোনও নাম হলেও ফাঁকা নয়

        openFileDialog.FileName = "AnyFile";
        openFileDialog.Filter = string.Empty;
        openFileDialog.CheckFileExists = false;
        openFileDialog.CheckPathExists = false;

6
আমি জানি এটি একটি পুরানো পোস্ট, তবে যে কেউ এটি চেষ্টা করে দেখতে চাইছেন, আপনি যে ডিরেক্টরিটি খুলতে চান তাতে যদি কোনও শিশু ডিরেক্টরি না থাকে তবে এটি আসলে কাজ করে না। সুতরাং আমি যদি আমার ব্যবহারকারীকে কোনও ফোল্ডারে ব্রাউজ করতে এবং এটি নির্বাচন করতে এবং কিছু পাঠ্য বাক্সে ফোল্ডার পথটি পপুলেট করতে চাই, ব্যবহারকারী কখনই সি নির্বাচন করতে পারে না: \ সোমারপ্যারডির ডিরেক্টরি যদি সি: \ সোমারপ্যারডির \ সোমারচিল্ডির উপস্থিত থাকে, কারণ "খুলুন" নির্বাচন করুন "কেবল আপনাকে চাইল্ড ডিরেক্টরিতে নিয়ে আসে।
জিম

খুব ভাল চেষ্টা করুন .. তবে ফলাফলটি টেক্সটবক্সে "যেকোন ফাইল" হিসাবে ভয়ানক ইউআইয়ের ফলাফল হিসাবে কেবল ব্যবহারকারী তার পাঠ্যটিকে ওভাররাইড করার জন্য অপেক্ষা করছে .. এ ছাড়া ব্যবহারকারী ফাইলগুলিও নির্বাচন করতে পারবেন - যথেষ্ট ভাল নয়। তবে দুর্দান্ত চেষ্টা করুন ..
জিওয়াই

1

WPF জন্য Ookii ডায়ালগ গ্রন্থাগার একটি বর্গ যে WPF জন্য একটি ফোল্ডার ব্রাউজার ডায়ালগের একটি বাস্তবায়ন প্রদান করে।

https://github.com/augustoproiete/ookii-dialogs-wpf

এখানে চিত্র বর্ণনা লিখুন

উইন্ডোজ ফর্মগুলির সাথে কাজ করে এমন একটি সংস্করণ রয়েছে ।


-1

আমি জানি প্রশ্নটি ছিল কনফিগারেশন নিয়ে on OpenFileDialog তবে গুগল আমাকে এখানে এনেছে তা আমি এও উল্লেখ করতে পারি যে আপনি যদি কেবল ফোল্ডার সন্ধান করছেন FolderBrowserDialogতবে নীচের অন্য কোনও এসও প্রশ্নের উত্তর হিসাবে আপনি তার পরিবর্তে ব্যবহার করা উচিত should

Vb.net- এ ওপেন ফাইল ডায়ালগ ব্যবহার করে কীভাবে পাথ নির্দিষ্ট করবেন?


বিভ্রান্তিকর। 1) এটা না শুধুমাত্র পছন্দ; 2) এটি বেশিরভাগ ক্ষেত্রেই ভাল পছন্দ নয়; তবুও এটির সর্বনিম্ন কোড প্রয়োজন, আরও শেষ ব্যবহারকারীর দ্বারা ব্যয় করা ব্যবসায়।
মেও বিড়াল 2012
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.