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



你能告诉我如何将多按钮事件放在一起吗?

编写所有多按钮事件是不好的可维护性。 所以我想将许多按钮事件转换为一种方法。 喜欢这个。。。

以前

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       
}

private void buttonClickEvent(object sender, EventArgs e)
{ 
Button btn = (Button)sender;
int index = int.Parse(btn.Name.Replace("button", ""));
if(index==1)
{ 
//button1 event
}
if(index==2)
{ 
//button2 event
}
}

在 ASP.NET Web 窗体中,我已经像这样解决了这种情况。

定义一个通用的隐藏按钮(这将是所有人的触发器(。您应该使用样式将其定义为"隐藏"。

<asp:Button ID="btnPrintPdf" runat="server" Style="display: none" OnClick="btnPrint_Click" />

对于所有其他按钮"重定向"客户端的单击,如下所示:

btnPrintPlan.OnClientClick = ClientScript.GetPostBackClientHyperlink(btnPrintPdf, itemData.ClientIw.ID.ToString() + "|" + ((int)PrintDocs.NextStepsPlan).ToString()) + ";return false;";
btnPrintNetWorth.OnClientClick = ClientScript.GetPostBackClientHyperlink(btnPrintPdf, itemData.ClientIw.ID.ToString() + "|" + ((int)PrintDocs.NetWorth).ToString()) + ";return false;";

如您所见,我使用枚举通过单击不同的按钮来定义要打印的内容。

最后一部分是定义"常规"按钮逻辑:

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

你可以尝试这样的事情。如果你有数百个按钮,字典会比if更好。

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);     
}

尽管这仍然与仅实现每个单独的ButtonClickEvent没有太大区别。

最新更新