假设我有2个按钮,它们应该执行相同的操作但是在不同的对象上。
目前我正在将所有需要的引用传递给这样的方法:
private void sub1_add_to_db_btn_Click(object sender, EventArgs e)
{
Add_Substance_To_Database(
substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn, sub1_found_in_db_list,
sub2_found_in_db_list, false, sub1_listBox, sub2_listBox);
}
private void sub2_add_to_db_btn_Click(object sender, EventArgs e)
{
Add_Substance_To_Database(
substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn, sub2_found_in_db_list,
sub1_found_in_db_list, false, sub2_listBox, sub1_listBox);
}
我想知道是否还有其他更有效的方法。感谢。
编辑:
这是我的一些代码看起来如何,它让我疯狂!!!
private void sub1_add_to_db_btn_Click(object sender, EventArgs e)
{
Add_Substance_To_Database(substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn,
sub1_found_in_db_list, sub2_found_in_db_list, false, sub1_listBox, sub2_listBox);
}
private void sub2_add_to_db_btn_Click(object sender, EventArgs e)
{
Add_Substance_To_Database(substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn,
sub2_found_in_db_list, sub1_found_in_db_list, false, sub2_listBox, sub1_listBox);
}
private void sub1_edit_name_btn_Click(object sender, EventArgs e)
{
Add_Substance_To_Database(substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn,
sub1_found_in_db_list, sub2_found_in_db_list, true, sub1_listBox, sub2_listBox);
}
private void sub2_edit_name_btn_Click(object sender, EventArgs e)
{
Add_Substance_To_Database(substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn,
sub2_found_in_db_list, sub1_found_in_db_list, true, sub2_listBox, sub1_listBox);
}
private void sub1_delete_from_db_btn_Click(object sender, EventArgs e)
{
Delete_Substance_From_DB(sub1_listBox,
sub2_listBox,sub2_list_is_from_file,sub1_delete_from_db_btn,
sub2_delete_from_db_btn);
}
private void sub2_delete_from_db_btn_Click(object sender, EventArgs e)
{
Delete_Substance_From_DB(sub2_listBox,
sub1_listBox,sub1_list_is_from_file,sub2_delete_from_db_btn,
sub1_delete_from_db_btn);
}
例如: 如果我想删除一种物质,我需要从两个列表中删除它并将其从其他列表中删除,将选择更改为下一个物质等...
答案 0 :(得分:5)
鉴于您将不同的值传递给Add_Substance_To_Database
,您现在拥有的内容可能是您可以预期的最易维护的代码。
您可以将一个事件处理程序附加到两个按钮,但您必须确定按下了哪个按钮并传递相关参数:
if (sender == button1)
{
Add_Substance_To_Database(
substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn, sub1_found_in_db_list,
sub2_found_in_db_list, false, sub1_listBox, sub2_listBox);
}
else
{
Add_Substance_To_Database(
substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn, sub2_found_in_db_list,
sub1_found_in_db_list, false, sub2_listBox, sub1_listBox);
}
这让你无处可去。
答案 1 :(得分:3)
这根本不是代码重复的情况。重构SUCH案例只能做到:
请参阅:Any valid reason for code duplication?
编辑:
如果在事件处理程序中有任何重复的“肉”,我建议可能会有所不同。但是你把所有内容都归结为Add_Substance_To_Database
,因此你已经成功地重复删除了代码。
答案 2 :(得分:0)
事件处理程序可能是一个用于少数控件,在发送器中你有按钮控制,哪个调用事件,将它转换为Button类并使用tham作为方法的参数
var 按钮 =发件人为按钮;
Add_Substance_To_Database( substanse2,按钮,sub1_add_to_db_btn,sub2_found_in_db_list, sub1_found_in_db_list,false,sub2_listBox,sub1_listBox);
对于其他参数,您可以使用属性Tag,它的对象用于开发人员目的
答案 3 :(得分:0)
最终我按照自己的建议...... 我创建了一个包含所有控制器的对象数组,并向控制器事件处理程序添加了相同的方法。在方法中,我只需根据发件人选择合适的控制器。
substance1_controllers = new object[]{
sub1_main_listbox, sub1_peaks_list,sub1_found_in_db_list,
sub1_similar_in_db_list, sub1_eigenvector_list,
sub1_sourse_switch_btn, sub1_folder_btn,sub1_add_to_db_btn,
sub1_edit_name_btn,sub1_delete_btn, sub1_picture_box,
chart_peaks.Series[0], chart_compare.Series[0], true, -1};
substance2_controllers = new object[]{
sub2_main_listbox, sub2_peaks_list, sub2_found_in_db_list,
sub2_similar_in_db_list,sub2_eigenvector_list,
sub2_sourse_switch_btn, sub2_folder_btn, sub2_add_to_db_btn,
sub2_edit_name_btn,sub2_delete_btn, sub2_picture_box,
chart_peaks.Series[1],chart_compare.Series[1], true, -1};
看起来似乎很难保持这种方式,但我个人觉得在这张桌子的帮助下维护和使用非常舒服(看起来很棒):
// [0] - Main Listbox
// [1] - Peaks Listbox
// [2] - Found in Database Listbox
// [3] - Found similar Listbox
// [4] - Eigenvectors Listbox
// [5] - Switch sourse Button
// [6] - Change Folder Button
// [7] - Add to Database Button
// [8] - Edit Name Button
// [9] - Delete Button
// [10] - Picture Box
// [11] - Peaks Chart Series
// [12] - Compare Chart Series
// [13] - List is from File Boolean
// [14] - Previous Selected Index
方法示例:
void Delete_Substance_From_DB(object sender, EventArgs e)
{
object[] controller;
object[] other_controller;
if (((Button)sender).Name == "sub1_delete_btn")
{
controller = substance1_controllers;
other_controller = substance2_controllers;
}
else
{
controller = substance2_controllers;
other_controller = substance1_controllers;
}
}
使用考试:
if (((ListBox)other_controller[0]).Items.Count != 0)
{
if (((ListBox)other_controller[0]).Items.Count == index2)
{
((ListBox)other_controller[0]).SelectedIndex = index2 - 1;
}
else
{
((ListBox)other_controller[0]).SelectedIndex = index2;
}
Main_Listbox_Index_Changed(((ListBox)other_controller[0]), null);
}