2011-06-07 111 views
1

我是C#的一名新手,並且希望避免代碼重複。我有一個父窗體和一組子窗體。子窗體都含有序列化的文本框,並將它們發送到一個公共接口部分對象代碼:避免C#表單中的代碼重複

public partial class Normal : UserControl 
    { 
    Interfacer normintobj = new Interfacer(STATCTRL.NORMDIST); 
    public Normal() 
    { 
     InitializeComponent(); 
    } 

    private void z_tb_KeyDown(object sender, KeyEventArgs e) 
    { 
     sendinfo(e,STATMAIN.VINP_Z_NORMAL); 
    } 

    private void serializethensendinfo() 
    { 
     normintobj.tbs[0] = UITest.testui(z_tb.Text); 
     normintobj.tbs[1] = UITest.testui(Mean_tb.Text); 
     normintobj.tbs[2] = UITest.testui(sd_tb.Text); 
     normintobj.tbs[3] = UITest.testui(left_tb.Text); 
     normintobj.tbs[4] = UITest.testui(tt_tb.Text); 
    } 

    private void unserializethensendinfo() 
    { 
     z_tb.Text = Convert.ToString(normintobj.tbs[0]); 
     Mean_tb.Text = Convert.ToString(normintobj.tbs[1]); 
     sd_tb.Text = Convert.ToString(normintobj.tbs[2]); 
     left_tb.Text = Convert.ToString(normintobj.tbs[3]); 
     tt_tb.Text = Convert.ToString(normintobj.tbs[4]); 
    } 

    private void sendinfo(KeyEventArgs e,int field) 
    { 
     serializethensendinfo(); 
     normintobj.chk_tb_type(ref textBlock1, field, e); 
     unserializethensendinfo(); 
    } 

    private void sendinfo(int field) 
    { 
     serializethensendinfo(); 
     normintobj.chk_tb_type(ref textBlock1, field); 
     unserializethensendinfo(); 
    } 

    private void Mean_tb_KeyDown(object sender, KeyEventArgs e) 
    { 
     sendinfo(e,STATMAIN.NORMDIST_MID); 
    } 

    private void sd_tb_KeyDown(object sender, KeyEventArgs e) 
    { 
     sendinfo(e,STATMAIN.NORMDIST_MID); 
    } 

    private void left_tb_KeyDown(object sender, KeyEventArgs e) 
    { 
     sendinfo(e, STATMAIN.VOUT_LEFT_NORMAL); 
    } 

    private void tt_tb_KeyDown(object sender, KeyEventArgs e) 
    { 
     sendinfo(e,STATMAIN.VOUT_LEFT_NORMAL); 
    } 


    private void z_tb_LostFocus(object sender, RoutedEventArgs e) 
    { 
     sendinfo(STATMAIN.VINP_Z_NORMAL); 
    } 

    private void Mean_tb_LostFocus(object sender, RoutedEventArgs e) 
    { 
     sendinfo(STATMAIN.NORMDIST_MID); 
    } 

    private void sd_tb_LostFocus(object sender, RoutedEventArgs e) 
    { 
     sendinfo(STATMAIN.NORMDIST_MID); 
    } 

    private void left_tb_LostFocus(object sender, RoutedEventArgs e) 
    { 
     sendinfo(STATMAIN.VOUT_LEFT_NORMAL); 
    } 

    private void tt_tb_LostFocus(object sender, RoutedEventArgs e) 
    { 
     sendinfo(STATMAIN.VOUT_TWO_NORMAL); 
    } 

我與serializethensendinfo一個真正的問題,unserializeandsendinfo和重載sendinfo方法......我發現自己剪切和粘貼我的所有子表單上的相同功能(大約20個),但是然後更改文本框的名稱。當文本框是不同的名稱時,如何避免代碼重複?

回答

1

如果沒有規範化所有頁面上的文本框,然後將這些方法推入基類中,則不容易修復。

你可以做一些事情,比如把方法推到基類中,改變方法簽名來獲取一個List,然後在頁面級創建List的方法。

它應該減少邏輯重複,但你仍然有一些代碼來寫。

private void serializethensendinfo(IEnumberable<TextBox> listOfTextBoxes) 
{ 
    for(int i = 0; i < listOfTextBoxes.Count; i++) 
    { 
     normintobj.tbs[i] = UITest.testui(listOfTextBoxes[i].Text); 
    }  
} 

private void unserializethensendinfo(IEnumberable<TextBox> listOfTextBoxes) 
{ 
    for(int i = 0; i < listOfTextBoxes.Count; i++) 
    { 
     listOfTextBoxes[i].Text = Convert.ToString(normintobj.tbs[i]); 

     normintobj.tbs[i] = UITest.testui(listOfTextBoxes[i].Text); 
    } 
} 

此代碼是未經測試,你可能需要在列表中通過按地址,這樣就可以寫回文本框。另外,該列表可能需要在頁面級別靜態定義......如果不進行一些測試並完全理解方法的用例,我並不是100%確定的。