1

我希望为用户单击的每个 WinForms 按钮单击添加一个日志语句,理想情况下,是父窗体的标识符(例如标题栏)。我看过记录所有鼠标点击的帖子,但我只对记录按钮点击感兴趣。我在这里阅读了接受的答案并对其进行了调整:

public class ButtonLogger
{
    private static readonly ILog Logger = LogManager.GetLogger(typeof(ButtonLogger));
    public static void AttachButtonLogging(Control.ControlCollection controls)
    {
        foreach (var button in controls.OfType<Button>())
        {
            button.Click += LogButtonClick;
        }
    }
    private static void LogButtonClick(object sender, EventArgs eventArgs)
    {
        Button button = sender as Button;
        Logger.InfoFormat("Button clicked: {0} ({1})", button.Text, button.Parent.Text);
    }
}

此类以形式在构造函数的末尾使用,例如:

ButtonLogger.AttachButtonLogging(this.Controls);

我面临的问题是 Controls 属性似乎没有引用我的按钮。这可能是因为按钮没有直接添加到表单中,而是添加到 Controls 属性中的另一个控件。但是,Controls 属性只包含一个控件,即 ToolStrip。

有没有办法可以利用表单上的所有按钮,而不管它们的父容器是什么?我的最终目标是向我的按钮添加一个日志语句,所以如果除了按钮单击事件方法之外可以通过其他方式完成,那么我也对此持开放态度

4

2 回答 2

4

我相信您需要递归搜索按钮:

public static void AttachButtonLogging(Control.ControlCollection controls)
{
    foreach (var control in controls.Cast<Control>())
    {
        if (control is Button)
        {
           Button button = (Button)control;
           button.Click += LogButtonClick;
        }
        else
        {
            AttachButtonLogging(control.Controls);
        }
    }
}
于 2013-07-30T14:13:45.917 回答
0

您可以考虑的一件事是创建标准Button类的子类,并让按钮本身进行日志记录。当然,您必须四处走动并将应用程序中的所有按钮替换为您自己的实现,但应该可以通过全局搜索+替换来做到这一点。

这是一个示例实现:

public class LoggerButton : Button
{
    private static readonly ILog Logger = LogManager.GetLogger(typeof(LoggerButton));

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        Logger.InfoFormat("Button clicked: {0} ({1})", this.Text, this.Parent.Text);
    }
}
于 2013-07-30T14:22:44.613 回答