记录Win Forms应用程序中的所有按钮单击

时间:2013-07-30 14:09:56

标签: c# winforms button logging

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

    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属性仅包含一个控件,即ToolStrip。

有没有办法可以利用表单上的所有按钮,无论其父容器如何?我的最终目标是在我的按钮上添加一个日志语句,所以如果除了按钮点击事件方法之外还可以通过其他方式完成,那么我对此也是开放的

2 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分: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);
    }
}