Создание формы как многоразового элемента управления, такого как FolderBrowser

#c# #winforms #user-controls #custom-controls

#c# #winforms #пользовательские элементы управления #пользовательские элементы управления

Вопрос:

Я создал форму, которая эмулирует a FolderBrowseDialog , но с некоторыми дополнительными функциями, которые я хотел. Он протестирован и работает, поэтому теперь я хочу превратить его в элемент управления. Моя проблема в том, что, как только я наследую from UserControl вместо Form , у меня больше нет Close() метода, и у меня больше нет FormClosing события. Когда я нажимаю кнопку «ОК» или «Отмена», как мне закрыть форму и вернуть управление вызывающему объекту?

Ответ №1:

Чтобы сделать его многоразовым компонентом, вместо того, чтобы пытаться получить его из Control , создайте Component , который использует эту форму. Таким образом, он может отображаться в toolbox, и вы можете поместить экземпляр вашего компонента в design surface, как и другие компоненты.

Ваш компонент должен содержать некоторые свойства, которые вы хотите отобразить из диалогового окна, также содержать ShowDialog метод, который создал вашу форму, используя некоторые свойства (например, заголовок, начальный каталог), а также показывает вашу пользовательскую форму как диалоговое окно и устанавливает некоторые свойства (например, выбранную папку) и возвращает результат диалога. Например:

 using System.ComponentModel;
using System.Windows.Forms;
public partial class MyFolderBrowser : Component
{
    public string Text { get; set; }
    public string SelectcedFolder { get; set; }
    public DialogResult ShowDialog()
    {
        using (var f = new YourCustomForm() { Text = this.Text })
        {
            var result = f.ShowDialog();
            if (result == DialogResult.OK)
                SelectcedFolder = f.SelectedFolder;
            return resu<
        }
    }
}
 

Комментарии:

1. Спасибо, это работает. Тем не менее, я нашел альтернативное решение. Я создал библиотеку классов, а затем заменил токен class.cs, который создается с помощью классов моей формы, а затем просто изменил пространство имен. Это работает, но мне больше нравится ваше решение. Это немного чище.

2. Если вы не создаете компонент, вы не сможете использовать его во время разработки, и вы должны использовать его только в коде. Но создание компонента позволяет вам поместить его экземпляр в вашу форму, как настоящий компонент браузера папок, таймер и так далее.