我希望为用户点击的每个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。
有没有办法可以利用表单上的所有按钮,无论其父容器如何?我的最终目标是在我的按钮上添加一个日志语句,所以如果除了按钮点击事件方法之外还可以通过其他方式完成,那么我对此也是开放的
答案 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);
}
}