Как разместить расширенный элемент управления WinForms на панели инструментов - PullRequest
10 голосов
/ 12 июля 2009

Я планирую добавить функциональные возможности в TextBox со следующим:

   public class TextBoxExt : TextBox  
    {
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
        }

    }

Вопрос в том, как мы можем использовать этот TextBoxExt? Есть ли способ поместить этот класс в ToolBox, чтобы мы могли просто перетащить его в форму? Если нет, то как лучше всего использовать TextBoxExt?

Ответы [ 8 ]

15 голосов
/ 12 июля 2009
  1. Создайте свой проект с TextBoxExt, убедитесь, что он компилируется нормально.
  2. С формой, в которой вы хотите TextBoxExt, откройте панель инструментов, щелкните правой кнопкой мыши и выберите «выбрать элементы»
  3. Найдите вам .exe или dll, которые вы скомпилировали в 1)
  4. убедитесь, что рядом с TextBoxExt стоит галочка, нажмите ok
  5. TextBoxExt должен появиться на панели инструментов, перетащите его на форму

(Есть еще один способ сделать это: открыть файл конструктора и переименовать экземпляры TextBox в TextBoxExt, но некоторые могут считать опасным ручное редактирование файлов конструктора)

7 голосов
/ 05 ноября 2014

Я знаю, что это супер старый вопрос, но, возможно, все еще полезен для кого-то, у кого есть такая же проблема, как у меня - так как он все еще в топе Google

Возможно, вам будет интересно использовать ToolboxItemAttribute (http://msdn.microsoft.com/en-us/library/system.componentmodel.toolboxitemattribute(v=vs.110).aspx).

Я сделал это на своем конце, чтобы решить проблему.

[ToolboxItem(true)]
public class PanelTitle : LabelControl  {
   // Whatever code to override LabelControl here...
}

Перестройте решение, и расширенный элемент управления должен отображаться на панели инструментов.

3 голосов
/ 12 июля 2009

Любой пользовательский элемент управления в вашем проекте должен автоматически отображаться на панели инструментов. Я обнаружил, что иногда элементы управления не отображаются, пока вы не закроете заново открытую Visual Studio. Я предполагаю, что проблема связана с кэшированием содержимого панели инструментов.

0 голосов
/ 10 марта 2015

В том же решении это должно работать автоматически. Тем не менее, я обнаружил, что если Target Framework не совпадают, Toolbox не заполняется (Я предполагаю, что на самом деле ссылка должна иметь ту же версию или ниже, чем цель ссылки.) Сделав эти же Target Framework, Recompile, Restart VS. контроль заполнен правильно. (Я также добавил атрибут ToolboxItem (true))

0 голосов
/ 30 апреля 2013

Я создал пустой конструктор для своей пользовательской реализации UltraGridBagLayoutPanel. Несмотря на то, что david.healed прав, в этом нет необходимости, весьма полезно установить точку останова, чтобы проверить, что при инициализации формы он использует ваш класс для реализации вашего пользовательского элемента управления.

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

private Infragistics.Win.Misc.UltraGridBagLayoutPanel ultraGridBagLayoutPanel1;
this.ultraGridBagLayoutPanel1 = new Infragistics.Win.Misc.UltraGridBagLayoutPanel();

до

private Athia.Reports.ultraGridBagLayoutPanel1 ultraGridBagLayoutPanel1;
this.ultraGridBagLayoutPanel1 = new Athia.Reports.ultraGridBagLayoutPanel1();

При этом каждый раз происходит разрушение Visual Studio, и для его исправления необходимо использовать текстовый редактор, чтобы вернуть его снова. Поэтому, если кто-то не может описать, что не так с моей реализацией этого подхода, возможно, называть класс тем же, что и имя элемента управления, не очень хорошая идея, я думаю, что единственный безопасный и надежный способ достичь этого, как Calanus описывает в шагах 1 до 5 или как небольшое отклонение от этого, как справедливо указывает Роб Виндзор, перезапуск VS автоматически перенесет элемент управления в панель инструментов. К несчастью для меня, я должен изменить все дочерние элементы управления с исходного класса на мой настроенный класс: - (.

0 голосов
/ 03 июля 2012

Я попал в эту ловушку всего пару часов назад.
У меня есть проект приложения Windows .NET 2.0 с некоторыми пользовательскими элементами управления; это работало нормально. Поэтому я решил заказать мои файлы в подпапках, чтобы сделать мой проект немного чище.
После этого дизайнер Visual Studio 2010 перестал загружать мои формы, и ToolBox больше не отображает мои элементы управления.
Я испугался, переместив исходные файлы в корень проекта, сбросив ToolBox, но ничего не получалось. После этого я вспомнил, что использовал ReSharper «Удалить неиспользуемые ссылки», поэтому я попытался вернуть неиспользованную ссылку , в частности System.Data : проблема решена! : O
Я не могу сказать, почему, но у меня это сработало.
Надеюсь, мой опыт может помочь кому-то еще. :)
До свидания, Nando

0 голосов
/ 13 июля 2009

Ваш элемент управления должен появиться на панели инструментов для вашего решения автоматически. Чтобы оно появилось для других проектов, вам нужно выполнить пункты «Выбор элементов», как говорили другие.

Если вы хотите предоставить специальные функциональные возможности времени разработки, вам также потребуется предоставить некоторые дополнительные атрибуты, связанные с конструктором, и, возможно, ваш собственный класс, полученный из ControlDesigner.

0 голосов
/ 12 июля 2009

Вам необходимо добавить конструктор в производный класс.

public class TextBoxExt : TextBox      
{        
    public TextBoxExt()
    {
    }

    protected override void OnKeyPress(KeyPressEventArgs e)        
    {            
         base.OnKeyPress(e);        
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...