C# 如何标准化许多按钮事件#

C# 如何标准化许多按钮事件#,c#,.net,winforms,C#,.net,Winforms,你能告诉我如何组合多按钮活动吗 编写所有多按钮事件是不好的可维护性。 所以我想把许多按钮事件变成一个方法。 像这样 以前 private void button1_Click(object sender, EventArgs e) { //button1 event } private void button2_Click(object sender, EventArgs e) { //button2event } private void buttonN_Click(obj

你能告诉我如何组合多按钮活动吗

编写所有多按钮事件是不好的可维护性。 所以我想把许多按钮事件变成一个方法。 像这样

以前

private void button1_Click(object sender, EventArgs e)
{
    //button1 event
}

private void button2_Click(object sender, EventArgs e)
{
    //button2event
}

private void buttonN_Click(object sender, EventArgs e)
{ 
    //buttonNevent       
}
之后


在ASP.NET Web表单中,我已经像这样解决了这种情况

定义一个常规隐藏按钮(这将是所有按钮的触发器)。您应该使用样式将其定义为“隐藏”

<asp:Button ID="btnPrintPdf" runat="server" Style="display: none" OnClick="btnPrint_Click" />
如您所见,我使用枚举通过单击不同的按钮来定义要打印的内容

最后一部分是定义“通用”按钮逻辑:

 protected void btnPrint_Click(object sender, EventArgs e)
    {
        string sVal = Request.Params["__EVENTARGUMENT"];
        if (string.IsNullOrEmpty(sVal))
            return;
        string[] tks = sVal.Split('|');
        if (tks.Length != 2)
            return;
        string sOrderId = tks[0];
        string sPrintType = tks[1];
        int orderId = 0;
        int iPrintType = 0;
        if (!int.TryParse(sOrderId, out orderId) || !int.TryParse(sPrintType, out iPrintType))
            return;

        string sPdf = null;
        if (iPrintType == (int)PrintDocs.NextStepsPlan)
        {
           ....
        }//endif
        if (iPrintType == (int)PrintDocs.NetWorth)
        {
           ....
        }//endif

你可以试试这样的。如果你有数百个按钮,字典会比“如果”更好

private Dictionary<string, Action<object, EventArgs>> buttonEventMap = new  Dictionary<string, Action<object, EventArgs>>();

private void setup()
{
 buttonEventMap["button1"] = (object sender, EventArgs e)=>{Console.WriteLine("Button 1 Clicked");};
    
//  etc....
}

private void buttonClickEvent(object sender, EventArgs e)
{ 
    Button btn = (Button)sender;
    if( buttonEventMap.ContainsKey(btn.Name))
       buttonEventMap[btn.Name](sender, e);     
}
private Dictionary buttonEventMap=new Dictionary();
私有无效设置()
{
buttonEventMap[“button1”]=(对象发送者,事件参数e)=>{Console.WriteLine(“单击按钮1”);};
//等等。。。。
}
私有void按钮ClickEvent(对象发送方,事件参数e)
{ 
按钮btn=(按钮)发送器;
if(buttonEventMap.ContainsKey(btn.Name))
buttonEventMap[btn.Name](发送方,e);
}

虽然这只是与实现单独的ButoCutcCype事件没有什么不同。

我假设这是WiFrm,考虑编辑你的问题并添加相关的UI标签。而不是双击事件,单击控件的事件选项卡,然后取消单击事件类型
按钮ClickEvent
嗯,在我看来,第二个选项肯定是两个选项中最差的一个。。。它有一种非常难闻的气味,一个处理者有太多完全不同的职责。如果所有按钮(大致上)都做相同的事情——可能只是使用不同的参数——那么我们可能会争论。但通常情况下——不,这种想法不好,会导致更糟糕的可维护性。但是如果这里有一个有效的用例(你没有建议),那么解决方案就是手动分配所有处理程序,或者编写一些代码将所有按钮连接到一个处理程序。实际上,这取决于每个按钮事件的代码有多相似。我们不知道。讽刺的是,如果你写了
//button1事件
,如果你用真实的代码替换它,就说:
button1\u点击(发送者,e)然后你基本上绕着一圈走。
 protected void btnPrint_Click(object sender, EventArgs e)
    {
        string sVal = Request.Params["__EVENTARGUMENT"];
        if (string.IsNullOrEmpty(sVal))
            return;
        string[] tks = sVal.Split('|');
        if (tks.Length != 2)
            return;
        string sOrderId = tks[0];
        string sPrintType = tks[1];
        int orderId = 0;
        int iPrintType = 0;
        if (!int.TryParse(sOrderId, out orderId) || !int.TryParse(sPrintType, out iPrintType))
            return;

        string sPdf = null;
        if (iPrintType == (int)PrintDocs.NextStepsPlan)
        {
           ....
        }//endif
        if (iPrintType == (int)PrintDocs.NetWorth)
        {
           ....
        }//endif
private Dictionary<string, Action<object, EventArgs>> buttonEventMap = new  Dictionary<string, Action<object, EventArgs>>();

private void setup()
{
 buttonEventMap["button1"] = (object sender, EventArgs e)=>{Console.WriteLine("Button 1 Clicked");};
    
//  etc....
}

private void buttonClickEvent(object sender, EventArgs e)
{ 
    Button btn = (Button)sender;
    if( buttonEventMap.ContainsKey(btn.Name))
       buttonEventMap[btn.Name](sender, e);     
}