Поиск Winforms System.ComponentModel.Design Дизайн поверхности BeginDrag / EndDrag Хук событий

Вы можете сделать это, используя groupby для группировки в интересующей колонке, а затем apply list для каждой группы:

In [1]:
# create the dataframe    
df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]})
df
Out[1]:
   a  b
0  A  1
1  A  2
2  B  5
3  B  5
4  B  4
5  C  6

[6 rows x 2 columns]

In [76]:
df.groupby('a')['b'].apply(list)

Out[76]:
a
A       [1, 2]
B    [5, 5, 4]
C          [6]
Name: b, dtype: object
2
задан Reza Aghaei 19 January 2019 в 15:37
поделиться

2 ответа

В дополнение к точному и правильному ответу Резы (который я принял как ответ) по этой довольно специализированной теме:

Существует много возможных / жизнеспособных способов подключения дизайнера Winforms и его зависимые объекты (набор инструментов, сетка свойств и т. д.), поэтому последовательность / время добавления определенных сервисов дизайнера в контейнер сервисов области разработки будут отличаться. Некоторые службы должны быть добавлены явно (например, INameCreationService или IToolboxService); другие добавляются фреймворком.

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

Кроме того, многие объекты в пространстве имен System.ComponentModel.Design предлагают доступ к набору доступных служб, предоставляя метод GetService(). (В ответе Резы используется метод GetService объекта Site.) Если вы обнаружите, что GetService(typeof(BehaviorService)) не может вернуть действительный объект BehaviorService, это обычно означает, что BehaviorService еще не еще не было добавлен в область дизайна ... Я говорю "пока", потому что перетаскивание элементов управления, уже размещенных на поверхности конструктора, требует наличия BehaviorService в контейнере службы хоста. Поэтому, если ваша попытка получить экземпляр BehaviorService с помощью метода GetService не удалась, есть вероятность, что BehaviorService просто еще не был добавлен в конструкторскую среду. Чтобы решить эту проблему, вам обычно нужно просто переместить код для перехвата событий BehaviorService куда-нибудь вниз по течению.

Чтобы проверить, какие сервисы уже добавлены в область проектирования, вы можете проверить коллекцию объекта ServiceContainer объекта поверхности проектирования Services, которая содержит исчерпывающий список сервисов. Как предлагает Реза, хорошим местом для добавления кода, необходимого для подключения к событиям BehaviorService, является обработчик событий OnHandleCreated базовой формы.

0
ответ дан Jazimov 19 January 2019 в 15:37
поделиться

Вы можете получить BehaviorService и подписаться на его BeginDrag и EndDrag события.

  • BeginDrag : Происходит, когда BehaviorService начинает операцию перетаскивания.
  • EndDrag : Происходит, когда BehaviorService завершает операцию перетаскивания.

Пример

Сначала необходимо получить экземпляр BehaviorService, например, если у вас есть доступ к дизайнеру, хосту дизайнера или сайту можно получить службу поведения следующим образом:

var behaviorSvc = (BehaviorService)Site.GetService(typeof(BehaviorService));

Затем подписаться на события:

behaviorSvc.BeginDrag += BehaviorSvc_BeginDrag;
behaviorSvc.EndDrag += BehaviorSvc_EndDrag;

и обрабатывать события:

private void BehaviorSvc_EndDrag(object sender, BehaviorDragDropEventArgs e)
{  
}

private void BehaviorSvc_BeginDrag(object sender, BehaviorDragDropEventArgs e)
{
}
0
ответ дан Jazimov 19 January 2019 в 15:37
поделиться