Определите список обработчиков событий, связанных с событием

Вы можете использовать dplyr для этого:

library(dplyr)
df = data.frame(
  user = c("a", "a", "b", "b", "c"),
  v1   = c(1, 1, 1, 2, 1),
  v2   = c(0, 0, 0, 0, 1),
  v3   = c(0, 1, 0, 3, 1))

group_by(df, user) %>% 
summarize(v1_sum = sum(v1),
          v2_sum = sum(v2),
          v3_sum = sum(v3))      

Если вы не знакомы с нотой %>%, это в основном как трубопровод от bash. Он выводит результат из group_by() и помещает его в summarize(). То же самое можно было бы сделать так:

by_user = group_by(df, user)
df_summarized = summarize(by_user, 
                          v1_sum = sum(v1),
                          v2_sum = sum(v2),
                          v3_sum = sum(v3))  
29
задан JoshL 19 March 2009 в 09:24
поделиться

2 ответа

Короче говоря, Вы не предназначены, чтобы сделать это - но для отладки целей...

событие часто поддержано частным полем - но не со средствами управления; они используют эти EventHandlerList подход. Необходимо было бы получить доступ к форме, защитил Events участник, ища объект, отображенный на (частном) объекте EVENT_FORMCLOSING.

, Как только Вы имеете FormClosingEventHandler, GetInvocationList, должен сделать задание.

<час>
using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows.Forms;
class MyForm : Form
{
    public MyForm()
    { // assume we don't know this...
        Name = "My Form";
        FormClosing += Foo;
        FormClosing += Bar;
    }

    void Foo(object sender, FormClosingEventArgs e) { }
    void Bar(object sender, FormClosingEventArgs e) { }

    static void Main()
    {
        Form form = new MyForm();
        EventHandlerList events = (EventHandlerList)typeof(Component)
            .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance)
            .GetValue(form, null);
        object key = typeof(Form)
            .GetField("EVENT_FORMCLOSING", BindingFlags.NonPublic | BindingFlags.Static)
            .GetValue(null);

        Delegate handlers = events[key];
        foreach (Delegate handler in handlers.GetInvocationList())
        {
            MethodInfo method = handler.Method;
            string name = handler.Target == null ? "" : handler.Target.ToString();
            if (handler.Target is Control) name = ((Control)handler.Target).Name;
            Console.WriteLine(name + "; " + method.DeclaringType.Name + "." + method.Name);
        }
    }
}
32
ответ дан Marc Gravell 18 July 2019 в 15:26
поделиться

Проблема может заключаться в том, что форма не проверяется.

Событие FormClosing вызывается частным методом WmClose в ] Форма , которая инициализирует e.Cancel в ! Validate (true) . Я не исследовал, но в определенных обстоятельствах Validate всегда будет возвращать false , в результате чего закрытие будет отменено независимо от каких-либо обработчиков событий.

Чтобы исследовать это, включите .Net отладка исходного кода , установите точку останова в обработчике FormClosing , перейдите к источнику для Form.WmClose (вверх по стеку вызовов), установите точку останова в начало WmClose и снова закройте форму. Затем, пройдите через это в отладчике и посмотрите, почему Validate возвращает false . (Или какой обработчик событий устанавливает для e.Cancel значение true)

Чтобы решить проблему, установите для e.Cancel значение false в собственном обработчике.

1
ответ дан 28 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: