2013-04-14 2 views
0

Я хотел бы расширить FolderBrowserDialog, чтобы иметь возможность включать подпапки для выбранной папки (добавьте флажок, чтобы включить или отключить). Я узнал, что я не могу расширить основной FolderBrowserDialog, поскольку он является закрытым классом.Как создать пользовательский элемент управления, полученный из класса CommonDialog

Поэтому я считаю, что самым простым решением было бы создать пользовательский элемент управления, который является производным от CommonDialog (тот же класс, что и FolderBrowserDialog), скопируйте код из стандартного FolderBrowserDialog и немного измените его, чтобы он также имел флажок «Включить подпапки».

Но когда я скопировал код из умолчанию FolderBrowserDialog он дает мне ошибку:

missing partial modifier on declaration of type [my_class_name] another partial declaration of this type exists c# 

И это указывает на файл «[my_class_name] .Designer.cs».

namespace my_custom_folder_open 
{ 
    // Summary: 
    //  Prompts the user to select a folder. This class cannot be inherited. 
    [DefaultEvent("HelpRequest")] 
    [DefaultProperty("SelectedPath")] 
    [Designer("System.Windows.Forms.Design.FolderBrowserDialogDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] 
    public sealed class UserControl2 : CommonDialog 
    { 
     // Summary: 
     //  Initializes a new instance of the System.Windows.Forms.FolderBrowserDialog 
     //  class. 
     public UserControl2(); 

     // Summary: 
     //  Gets or sets the descriptive text displayed above the tree view control in 
     //  the dialog box. 
     // 
     // Returns: 
     //  The description to display. The default is an empty string (""). 
     [Browsable(true)] 
     [DefaultValue("")] 
     [Localizable(true)] 
     public string Description { get; set; } 
     // 
     // Summary: 
     //  Gets or sets the root folder where the browsing starts from. 
     // 
     // Returns: 
     //  One of the System.Environment.SpecialFolder values. The default is Desktop. 
     // 
     // Exceptions: 
     // System.ComponentModel.InvalidEnumArgumentException: 
     //  The value assigned is not one of the System.Environment.SpecialFolder values. 
     [Browsable(true)] 
     [Localizable(false)] 
     public Environment.SpecialFolder RootFolder { get; set; } 
     // 
     // Summary: 
     //  Gets or sets the path selected by the user. 
     // 
     // Returns: 
     //  The path of the folder first selected in the dialog box or the last folder 
     //  selected by the user. The default is an empty string (""). 
     [Browsable(true)] 
     [DefaultValue("")] 
     [Localizable(true)] 
     public string SelectedPath { get; set; } 
     // 
     // Summary: 
     //  Gets or sets a value indicating whether the New Folder button appears in 
     //  the folder browser dialog box. 
     // 
     // Returns: 
     //  true if the New Folder button is shown in the dialog box; otherwise, false. 
     //  The default is true. 
     [Browsable(true)] 
     [DefaultValue(true)] 
     [Localizable(false)] 
     public bool ShowNewFolderButton { get; set; } 

     // Summary: 
     //  Occurs when the user clicks the Help button on the dialog box. 
     [Browsable(false)] 
     [EditorBrowsable(EditorBrowsableState.Never)] 
     public event EventHandler HelpRequest; 

     // Summary: 
     //  Resets properties to their default values. 
     public override void Reset(); 
     protected override bool RunDialog(IntPtr hWndOwner); 
    } 
} 

Где может быть проблема?

Btw Я создал проект, как Windows Forms Library управления ..

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

2

Вы серьезно на ложном пути с этим. Эти диалоги являются компонентами, а не элементами управления. Они очень тонкие обертки вокруг диалоговых окон, встроенных в Windows. Эти диалоги сами ничего не знают о .NET и написаны в неуправляемом коде. Единственная причина, по которой они являются Компонентом, а не просто простым классом, - это позволить вам отбросить его на форму. Полезно установить несколько свойств с помощью конструктора.

Возможно, термин «CommonDialog» вводит в заблуждение. Microsoft назвала его «общим» только потому, что они обычно используются в программах GUI. И поощряется использование встроенных, так что каждая программа имеет очень похожий способ, например, открыть файл.

Не имеет смысла выводить из CommonDialog, потому что нет необходимости создавать настраиваемый диалог. Поскольку Windows имеет только встроенные, они уже обернуты соответствующими классами .NET. Ваш план разрушит то, что может сделать собственный FolderBrowserDialog. Который не включает показ флажков. Это было запечатано по уважительной причине.

0

Ганс совершенно прав, что вы не можете решить свою проблему, выведя новый класс из CommonDialog. Однако вы можете использовать компонент raw IFileDialog в режиме выбора папок. Вам также необходимо использовать IFileDialogCustomize, чтобы добавить свой флажок. Поскольку это просто COM, на самом деле это очень просто использовать из .net.

Смежные вопросы