Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301

Поменять button ы согласно определённому классу

01.10.2020, 13:46. Показов 1631. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят добрый день!

Мне нужны кнопки на форме с функцией "drop-down menu". Что это такое показано на картинке.
На известном форуме "Sta**ove" есть пример реализации данной функции.
Примерно так:
C#
1
2
3
4
public class SplitButton : Button
{
   ...
}
Тут видно, что класс "SplitButton" наследуется от класса "button".
Данную кнопку я реализовал. Разместив её на форме вручную, через метод:
C#
1
Controls.Add(mySpitButton)
Суть вопроса:
Как мне теперь наоборот, кнопки которые я разместил на форме (мои "button'ы"), с помощью дизайнера, сделать их "SplitButton'ами"? Не все. А те, которые захочу я. Что бы например мои кнопки с 1-6 (т.е. button1 - buttton6) имели такие же свойства, т.е. стали бы при инициализации формы, не обычными "button'ами", а "SplitButton'ами".
Я наобум попробовал:
C#
1
2
3
4
5
public Form1()
        {
            InitializeComponent();
            button1: SplitButton;
}
Но, эта затея успехом не увенчалась)
Изображения
 
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2020, 13:46
Ответы с готовыми решениями:

Классификация текста к определенному классу SVM
Здравствуйте, есть у кого-нибудь пример классификации текста к определенному классу методом опорных векторов? Или хорошая, а главное...

Как обеспечить возможность доступа из любого модуля к определенному классу?
Допустим в проекте есть модуль, в котором определен класс, состоящий из полей и методов, которые могут потом вызываться абсолютно из любого...

Архивирование файлов по заданной маске согласно определённому условию
Здравствуйте. Имеется задача: есть директория, куда ежедневно сохраняются аудиофайлы звонков с автоответчика. Скрин прилагается. В...

16
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
01.10.2020, 15:44
Цитата Сообщение от Schumacher57 Посмотреть сообщение
Как мне теперь наоборот, кнопки которые я разместил на форме (мои "button'ы"), с помощью дизайнера, сделать их "SplitButton'ами"?
Никак. Разве что зайти в модуль дизайнера (нажав F12 на InitializeComponent) и поменять тип нужных кнопок.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
01.10.2020, 16:05
Легко.
1. В коде пишете обработчики нужных событий для сплитов.
2. В рантайме перебираете "ваши" кнопки, прячете их, и на их месте создаете сплиты, которым назначаете нужные обработчики.
1
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
01.10.2020, 16:30  [ТС]
2. В рантайме перебираете "ваши" кнопки, прячете их, и на их месте создаете сплиты, которым назначаете нужные обработчики.
А это как, примерно? Хотя бы псевдокодом...

Добавлено через 1 минуту
И такой вопрос: А перенаследовать унаследованный класс нельзя?)
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
01.10.2020, 16:38
Schumacher57, почитай ещё про наследование: термин ты знаешь, но что за ним стоит ты не знаешь. Что значит "перенаследовать унаследованный"?
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
01.10.2020, 17:02  [ТС]
Добавлено через 14 минут
Цитата Сообщение от ViterAlex Посмотреть сообщение
Что значит "перенаследовать унаследованный"?
Не, про наследование, я вроде более менее, хотя конечно, не на 100%. Да, действительно, написал просто не очень понятно.
Т.е. я имею ввиду: Класс SplitButton, наследуется от класса Button, что я показал в коде выше. Теперь моя кнопка (SpliButton1) принимает иной вид. А вопрос, в том, могу ли я сделать, что-то типа подобного:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Buttton
{
   .... // Какой-то код, классической кнопки
}
 
public class SplitButton : Button
{
   ... // Тут класс SplitButton, который унаследовал, класс Button. (И изменил его внешний вид)
}
 
// А потом я хотел бы, провернуть такой трюк:
 
Button : SplitButton // Т.е. наследовать класс, который уже наследует родительский класс. Такое возможно?
// Или это полный бред?)
Я думал, может такое можно как-нибудь реализовать через Абстрактный класс или Интерфейс (который расширяет класс Button)?

Добавлено через 3 минуты
В общем, да, я не силён в ООП. Но, мне теперь и в правду, все элементы в ручную менять на форме?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
01.10.2020, 22:05
Цитата Сообщение от Schumacher57 Посмотреть сообщение
Я думал, может такое можно как-нибудь реализовать через Абстрактный класс или Интерфейс (который расширяет класс Button)?
Для начала определитесь, что Вам надо.
Если Вам нужна кнопка, которая будет отличаться от Button, например формой (кружок или овал), то Вам действительно нужно унаследовать новую кнопку от Button и перекрыть в ней метод, отвечающий за отрисовку, заменив прямоугольник на кружок. Ну а затем опять же в ране создать эти кнопки и положить их в нужные места.
Если же Вам надо вместо button динамически подсунуть SplitButton, то ничего ни у кого наследовать не надо, а надо просто динамически (т.е. в рантайме) спрятать button и показать сплин. При этом в дизайне создать и те, и другие друг на дружке, но для сплитов указать Visible = false;. Ну или создавать сплиты в ране, как было указано выше.
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
02.10.2020, 05:20  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Если Вам нужна кнопка, которая будет отличаться от Button, например формой (кружок или овал), то Вам действительно нужно унаследовать новую кнопку от Button и перекрыть в ней метод, отвечающий за отрисовку, заменив прямоугольник на кружок.
Вот, да. И получится, по факту, абсолютно другая кнопка (другой класс - SplitButton).
А теперь, в чём я испытываю проблему. В дизайнере, моей кнопки нету (фото №1). Но, на форму я уже накидал кнопки (фото №2).
Цитата Сообщение от MsGuns Посмотреть сообщение
Если же Вам надо вместо button динамически подсунуть SplitButton, то ничего ни у кого наследовать не надо, а надо просто динамически (т.е. в рантайме) спрятать button и показать сплин. При этом в дизайне создать и те, и другие друг на дружке, но для сплитов указать Visible = false;. Ну или создавать сплиты в ране, как было указано выше.
Вот тут, немного не понимаю.
Цитата Сообщение от MsGuns Посмотреть сообщение
Если же Вам надо вместо button динамически подсунуть SplitButton
Да, верно. Кнопки я уже накидал на форму. Как их теперь сделать необычными button, а Slitbutton.
Где-то при инициализации формы?)
Миниатюры
Поменять button ы согласно определённому классу   Поменять button ы согласно определённому классу  
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
03.10.2020, 12:55
Я немного ступил (давно и мало работал с конструктором форм VS) - элемента SplitButton там нетути
Но Вы его сотворили самостоятельно

Где-то, вероятно в событии инициализации формы или в событии FormCreate Вы эту свою кнопку создали и уложили на форму. Надеюсь, и обработчики ее событий приготовили. Т.е. сделали все самое сложное.

Дальше - просто.
Перебираете button и определяете, которые надо заменить.
Для каждого из них пишете Visible = false , т.е. просто прячете. Далее определяете элемент-контейнер этого Button и его Rectangle с координатами Top и Left.
Потом создаете новый экземпляр вашего SplitButton, и в его свойства Parent, Left, Top, Rectangle записываете полученные на предыдущем шаге значения.
Все это нужно проделать в том же FormCreate.

Но это при условии, что все кнопки "стационарны" и не меняются при работе приложения. Если же могут меняться (мало ли что, вдруг это надо по замыслу интерфейса), то код создания кнопок и замены оформить функцией, которую и надо вызывать каждый раз.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
03.10.2020, 13:08
Открываете код дизайнера и делаете там Search&Replace.
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
04.10.2020, 12:27  [ТС]
MsGuns, Someone007,
Ребят, спасибо за ответы! Я чувствую, что уже почти подобрался к решению проблемы Но:
Цитата Сообщение от MsGuns Посмотреть сообщение
Но Вы его сотворили самостоятельно
Вообще, взял с форума: StackO"er"low.
Цитата Сообщение от MsGuns Посмотреть сообщение
Где-то, вероятно в событии инициализации формы или в событии FormCreate Вы эту свою кнопку создали и уложили на форму. Надеюсь, и обработчики ее событий приготовили. Т.е. сделали все самое сложное.
Да, просто унаследовался от "Button") И добавил на форму так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        public Form1()
        {
            InitializeComponent();
 
            SplitButton myMenu = new SplitButton();
            myMenu.Text = "123";
            myMenu.TextAlign = ContentAlignment.TopLeft;
            Controls.Add(myMenu);
        }
// Просто добавил при инициализации формы, методом "Controls.Add(myMenu);"
 
// Просто в конце я ещё добавил класс (тут часть):
public class SplitButton : Button
{
    [DefaultValue(null), Browsable(true),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public ContextMenuStrip Menu { get; set; }
 
    [DefaultValue(20), Browsable(true),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public int SplitWidth { get; set; }
 
    public SplitButton() 
    {
        SplitWidth = 20;
    }
Автор класса: Sverrir Sigmundarson©

Цитата Сообщение от MsGuns Посмотреть сообщение
Дальше - просто.
Перебираете button и определяете, которые надо заменить.
Для каждого из них пишете Visible = false , т.е. просто прячете. Далее определяете элемент-контейнер этого Button и его Rectangle с координатами Top и Left.
Потом создаете новый экземпляр вашего SplitButton, и в его свойства Parent, Left, Top, Rectangle записываете полученные на предыдущем шаге значения.
Все это нужно проделать в том же FormCreate.
А можно, маломальский пример, я сразу допру, плз?
Someone007,
Цитата Сообщение от Someone007 Посмотреть сообщение
Открываете код дизайнера и делаете там Search&Replace.
Открыл я дизайнер, и попробовал сделать следующее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
    partial class Form1
    {
private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new SplitButton(); // Тут я попробовал поменять, свою кнопку на кнопку SplitButton
 
         }
        private System.Windows.Forms.Button button1;
        private SplitButton button2; // Здесь тоже провернул такой трюк.
    }
Но, ничего невышло Кнопка осталась прежней...

Но, повторюсь, благодаря вам, я чувствую что где-то рядом
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
04.10.2020, 12:34
Цитата Сообщение от Schumacher57 Посмотреть сообщение
Но, ничего невышло Кнопка осталась прежней...
Не может такого быть. У вас либо ошибка компиляции, либо вы что-то не так сделали.
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
04.10.2020, 12:52  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Дальше - просто.
Перебираете button и определяете, которые надо заменить.
Для каждого из них пишете Visible = false , т.е. просто прячете. Далее определяете элемент-контейнер этого Button и его Rectangle с координатами Top и Left.
Потом создаете новый экземпляр вашего SplitButton, и в его свойства Parent, Left, Top, Rectangle записываете полученные на предыдущем шаге значения.
Все это нужно проделать в том же FormCreate.
Получилось, след. способом:
C#
1
2
3
4
5
6
7
8
9
10
11
        public Form1()
        {
            InitializeComponent();
 
            SplitButton myMenu = new SplitButton();
            myMenu.Text = "123";
            myMenu.TextAlign = ContentAlignment.TopLeft;
            myMenu.Location = button1.Location; //Получаю координаты кнопки1
            Controls.Add(myMenu);
            button1.Visible = false; //Отключаю кнопку1
            }
Но, тогда вместо 5 кнопок у меня получится 10. Ну и соответственно по квадратичной зависимости. Наверно не очень хорошо скажется на производительности? Или до 50-60 кнопок это не критично...?
Вообще, конечно пока хоть какое-то решение... Но, прям, всем костылям костыль...

Добавлено через 4 минуты
Someone007,
Цитата Сообщение от Someone007 Посмотреть сообщение
Не может такого быть. У вас либо ошибка компиляции, либо вы что-то не так сделали.
Т.е. в целом, замены произвёл правильно?
Щас подробненько поковыряю

Добавлено через 10 минут
Цитата Сообщение от Someone007 Посмотреть сообщение
Не может такого быть. У вас либо ошибка компиляции, либо вы что-то не так сделали.
Никак, только что снова создал кнопку (button3)
Поменял, в инициализации
C#
1
2
3
4
5
6
7
8
9
10
11
12
partial class Form1
 {
     private void InitializeComponent()
      {
       this.button3 = new TestOnlyListData.Form1.SplitButton();
       }
//И тут ещё есть ссылка на button3
 
 
#endregion
    private SplitButton button3;
//Всё больше я нигде не вижу ссылок на кнопку....
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
04.10.2020, 13:05
Schumacher57, Ну так вам наверное еще нужно ее добавить в контейнер.
C#
1
this.Controls.Add(button3);
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
04.10.2020, 13:14  [ТС]
Ну так вам наверное еще нужно ее добавить в контейнер.
Не, кнопка на форме появляется, но она почему-то обычная, не “SplitButton”...(
И Controll.Add создаётся (выполняется) же автоматически, при добавлении через дизайнер...
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
04.10.2020, 13:22
Лучший ответ Сообщение было отмечено Schumacher57 как решение

Решение

Цитата Сообщение от Schumacher57 Посмотреть сообщение
Т.е. в целом, замены произвёл правильно?
Да, всё правильно.

Если вы внимательно посмотрите код класса SplitButton, а именно на строку
C#
1
if (this.Menu != null && this.SplitWidth > 0)
то вам сразу станет ясно почему у вас ничего не работает... Можно задать свойство Menu после редактирования например через дизайнер...

У меня например вот это
C#
1
2
3
4
5
6
            SplitButton myMenu = new SplitButton();
            myMenu.Text = "123";
            myMenu.TextAlign = ContentAlignment.TopLeft;
            myMenu.Location = button1.Location; //Получаю координаты кнопки1
            Controls.Add(myMenu);
            button1.Visible = false; //Отключаю кнопку1
не работает, остается обычная кнопка, т.к. тут тоже свойство myMenu.Menu нигде не задается...
1
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
04.10.2020, 13:36  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Если вы внимательно посмотрите код класса SplitButton, а именно на строку
Госпади
Да, как только Вы это написали, я сразу понял, в чём затупил!(
Спасибо, огромейнейшее!!!! У меня мало опыта, вот он и сказался. Лень было прочесть код! Хотя даже, его кое-где подправил, но никак не обратил внимание на это условие

Не по теме:

Я изменил: ContextMenuStrip на ContextMenu...
Блин, щас пока запара с тем чтобы оно вызывалась, под положением кнопки мыши.
Но, я пока лучше пойду покурю, на сегодня. А то, такую фигню, и не увидить... :(



Не по теме:

Огромное спасибо! Видно, что зашли и разобрались. Очень благодарен!!! Без Вас бы точно, не справился.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.10.2020, 13:36
Помогаю со студенческими работами здесь

Выделить шрифт в ячейке нужным цветом, согласно определенному условию
Как сделать чтобы в ячейке шрифт выделялся нужным цветом согласно определенному условию. Пример: Допустим есть диапазон ячек А1:A300 в...

Поменять числа местами, согласно условию
Здравствуйте, помогите с написание программы. Вот такое вот условие, "Даны действительные числа a, b, c. Напишите программу, позволяющую...

Можно ли поменять форму Button?
Можно ли поменять форму button? Например на круглую?

Если Button 1 и Button 2 нажаты - Button 3 стала активной, как?
Проверка если Button 1 и Button 2 нажаты - Button 3 стала активной Причем нужно чтобы это срабатывало только после того как вторая...

Как поменять стилизацию кнопки(Button)
Мне нужно что бы кнопка была из картинки, предоставьте код пожалуйста.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru