C# 删除“打印预览”对话框中的默认打印按钮功能

C# 删除“打印预览”对话框中的默认打印按钮功能,c#,winforms,C#,Winforms,我正在使用Winforms,我创建了一个打印预览对话框来打印报告。我还在打印预览的另一个按钮上创建了自己的打印功能。在“打印预览”对话框上还有一个“打印”按钮。我想在该按钮上创建一个新的处理程序,以便调用我自己的方法 我通过使用 ((ToolStripButton)((ToolStrip)dlgPreview.Controls[1]).Items[0]).Click += new System.EventHandler(this.button1_Click); 尽管调用了这两个方法,但仍使用

我正在使用Winforms,我创建了一个打印预览对话框来打印报告。我还在打印预览的另一个按钮上创建了自己的打印功能。在“打印预览”对话框上还有一个“打印”按钮。我想在该按钮上创建一个新的处理程序,以便调用我自己的方法

我通过使用

 ((ToolStripButton)((ToolStrip)dlgPreview.Controls[1]).Items[0]).Click += new System.EventHandler(this.button1_Click);
尽管调用了这两个方法,但仍使用此方法。考虑到我只使用+=。它创建一个新的处理程序并将其附加到按钮。这两个处理程序都被调用。我想我可以通过使用-=删除原始处理程序,但是我会在-=的右侧放置什么

是否有其他方法可以删除原始处理程序,而只保留我的个人处理程序?
我使用的是C和Winforms

我删除了那里的特定按钮,创建了一个具有我自己功能的新按钮,并将其添加到那里,从而使其正常工作

使用此代码

     ToolStripButton b = new ToolStripButton();
 b.ImageIndex = ((ToolStripButton)((ToolStrip)dlgPreview.Controls[1]).Items[0]).ImageIndex;

        ((ToolStrip)dlgPreview.Controls[1]).Items.Remove(((ToolStripButton)((ToolStrip)dlgPreview.Controls[1]).Items[0]));
        b.Visible = true;
        ((ToolStrip)dlgPreview.Controls[1]).Items.Insert(0, b);
        ((ToolStripButton)((ToolStrip)dlgPreview.Controls[1]).Items[0]).Click += new System.EventHandler(this.button1_Click);
基本上我是:

创建新按钮 从原始按钮获取图像 从工具条上拆下原始按钮 添加新按钮 添加我的个人处理程序
只希望他们不会改变窗口中的任何内容,否则你的代码会被破坏。你不能在一个新表单上使用PrintPreviewControl,而不是在PrintPreviewDialog上使用这种黑客攻击吗?顺便说一句,如果你想受苦而不想改变……那么你可以使用反射来清除该事件的后备存储代理。@AdrianoRepetti我想到了一个如何解决此问题的想法,我做到了,在我发布问题后,它解决了我的问题,所以我也发布了问题的答案below@AdrianoRepetti在我的窗口中更改任何内容是什么意思?可以通过子类化添加额外的功能。让我解释一下我的意思:当您单击“打印”,然后单击“打印预览”对话框时,您只需要求打印document.print即可。它只是要求在逻辑所在的位置打印控制器。PrintController也可以子类化,但它也会通知调用OnBeginPrint的PrintDocument。这是您的切入点,您可以将PrintDocument子类化以覆盖OnBeginPrint或为BeginPrint添加事件处理程序…无需在打印开始前替换UI按钮即可完成某些操作。这是一项稳定的技术,但并不意味着它不会改变,特别是因为它将长期受支持。如果一个新的Windows版本将添加/更改一些他们不能忽略的东西,如果出现严重的安全漏洞…他们将更改它,以确保他们不会担心保持控制索引稳定!你的密码会被破解。它甚至可能在某些情况下被破坏,但并不总是因为局部补丁。只是一个警告,正如前面提到的,如果他们更改了您执行其黑客攻击所依赖的代码,这可能会在以后引起痛苦。“我会认真重新考虑的。”本贾明保罗请详细说明。你是说改变Winforms的代码?是的,他指的是表单代码本身。但可能性很小。@DonBoitnott可能性不大,因为WinForms是一种过时的技术,但并非不可能,也不是很难调试,除非您检查WinForms代码以了解可能发生的情况。您是否曾经担心移动控件,因为它将更改其在控件集合中的索引?当然不是。不仅如此,问题本身也很奇怪:替换打印按钮做什么?我想,我们已经有了关于那种XY问题的打印文件。@AdrianoRepetti我的观点正是如此。Winforms被认为是死的,而不是变化。现在,如果微软决定将其从.NETFramework中完全删除,那么这将是一个真正的问题。但未来不会发生任何变化