Как получить имя кнопки при ее нажатии ?

Автор Тема: Как получить имя кнопки при ее нажатии ?  (Прочитано 12323 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн LegantmarАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 1
имя кнопки определяется как buttontem.Name
но не могу понять как это соединить через событие (нажатие кнопки) ...
прошу помощи.
спасибо.

Оффлайн Акунец

  • ADN OPEN
  • Сообщений: 4
  • Карма: 1
    • BIM3D-Внедрение BIM и услуги BIM
  • Skype: aleksandrakunets
На habre по человечески про события написано. https://habrahabr.ru/post/213809/ .Конечно применить событие можно только к пользовательской кнопке, и только той которую сам пишешь.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Legantmar, если возник вопрос, как получить имя кнопки при ее нажатии, то это верный признак того, что вы идете по неправильному пути. Нужно использовать событие нажатия кнопки.

Оффлайн LegantmarАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 1
я знаю про события..
а если я перефразирую вопрос вот так:
разные кнопки вызывают один и тот же класс Command: IExternalCommand
как получить имя нажатой кнопки и передать его внутрь функции Execute(..)
это возможно?

p.s.
п.1 не знаю сколько будет кнопок и их имена
не хочу создавать разные функции внутри функции Execute и различные события и подписки (см. п.1)
не хочу потом править dll (дописывая разные подписчики на события) (см. п.1)
не хочу создавать уникальные dll на каждую кнопку (см. п.1)
вопрос не в том как использовать кнопку, чтобы она что-то запустила... а получить ее свойства при событии с ней

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Я по прежнему буду утверждать, что имена кнопок никуда передавать не надо. Функционал приложения никак не должен зависит от названий контролёров и уж тем более не должен зависеть от надписей в пользовательском интерфейсе. Это bad practice как минимум.

Учитывая P.S. и множество "я не  хочу", не буду даже пытаться советовать как сделать правильно. Скажу лишь общими словами, что передать значение из одного класса (форма с кнопками) в другой (Command), можно через конструктор, можно через свойство класса.
По описанию правда у меня есть еще вопросы, но вникать
не хочу

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
как получить имя нажатой кнопки
Если в событии, то
Код - C# [Выбрать]
  1. var buttonName = (sender as Button).Name;

Оффлайн LegantmarАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 1
//это  Это bad practice как минимум
Виктор, полностью согласен, но у меня плита упала именно на бэнтли, поверь очень нужно...  могу описать свою ситуацию, может быть это натолкнет на более правильную мысль, чем есть сейчас у меня.
я не сильно знаком с C# (всего полтора дня )))

Виктор, спасибо за ответ - var buttonName = (sender as Button).Name;
а можно подробнее в контексте:
Код - C# [Выбрать]
  1. using ...;
  2. using ...;
  3. using ...;
  4.  
  5. namespace Test
  6. {
  7.  
  8.     [Transaction(TransactionMode.Manual)]
  9.     [Regeneration(RegenerationOption.Manual)]
  10.     [Journaling(JournalingMode.NoCommandData)]
  11.     public class Command : IExternalCommand
  12.     {
  13.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  14.         {
  15.             try
  16.             {    
  17.             Application application = commandData.Application.Application;
  18.              UIApplication application = commandData.Application;
  19.  
  20.                // Вот здесь хочу получить имя кнопки как:
  21.               // [b]string NameButton = ???[/b];
  22.  
  23.                 return Result.Succeeded;
  24.             }
  25.        catch (Exception ex)
  26.             {
  27.                 int num = (int)TaskDialog.Show("Warning", ex.ToString());
  28.                 return Result.Failed;
  29.             }
  30.         }
  31. }
  32.  
« Последнее редактирование: 14-02-2017, 15:15:36 от Виктор Чекалин »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Legantmar,
В таком контексте - никак.
Похоже все таки придется разбираться и задавать уточняющие вопросы:)
Первое что мне непонятно, откуда берется форма с кнопками? Как она появляется/запускается? Обычно форма и создается в методе Execute Или это вообще не форма? Тогда какие кнопки вызывают одну и ту же команду? Кнопки на ленте, которые вы создали?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
int num = (int)TaskDialog.Show("Warning", ex.ToString());
Не по теме, но в чем необходимость приводить результат к типу int? Чем не устроил enum TaskDialogResult?

UPD. Вопрос снять. Про полтора дня C# было добавлено не сразу.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
могу описать свою ситуацию, может быть это натолкнет на более правильную мысль, чем есть сейчас у меня.
Так с этого всегда и нужно описать - с описания цели, которую необходимо в итоге получить :)

Оффлайн LegantmarАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 1
Тогда рассказываю по порядку.
я не знаю C#
но я знаю немного Python (а точнее IronPython)
я хочу с ribbon кнопки запускать скрипты python (и да, я не хочу возиться с dll)
как это реализовано сейчас и почему не устраивает:
манифест - стартовая dll (пустышка)  - запуск python scripta - создание кнопок как PushButtonData(name, text, name.dll, "Command") (это условный пример)
для каждой кнопки предварительно заготовлены dll-пустышки, .py и .png с именами name - уникальное имя для внутреннего имени кнопки
все бы ничего, но из-за невозможности иметь одинаковые имена функций (или классов) в разных dll (ревит их похоже сливает в одну namespace), возникает проблема с запуском
Задача сделать одну универсальную dll - пустышку которая получала бы извне name нажатой кнопки и запускала бы py script c таким же именем.

Т.е. независимо от того, сколько будет кнопок, на каких вкладках, панелях (это все создается во внешнем py скрипте) стартовая dll IExternalApplicationl и универсальная dll IExternalCommand не должны редактироваться...
готов ответить на вопросы..

тело пустышки выглядит примерно так:
criptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.CreateScriptSourceFromFile(name.py").Execute(scope);


update: revitpythonshell не предлагать ))

Оффлайн LegantmarАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 1
т.е. сейчас под каждую кнопку мне приходиться создавать свою dll
с уникальным классом Name: IExternalCommand
чтобы избежать конфликта в последнем аргументе
хотелось бы PushButtonData(name, text, name.dll, "Command") - но конфликт
поэтому вот так PushButtonData(name, text, name.dll, "Name") и ручное создание кучи dll

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Я не уверен, что есть возможность получить название кнопки, которую нажали на ленте.
Но проблему я вижу вот в этой фразе:
под каждую кнопку мне приходиться создавать свою dll
Собственно в этом нет необходимости. Одна dll может содержать неограниченное количество команд.
И простое решение - создать столько внешних команд, сколько будет кнопок. Одна кнопка - одна внешняя команда. Все в одной dll естественно

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
А для создания кнопок можно воспользоваться моим решением

Оффлайн LegantmarАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 1
Я не уверен, что есть возможность получить название кнопки, которую нажали на ленте.
спасибо, печально..