【问题标题】:Avoiding code duplication in C# forms避免 C# 表单中的代码重复
【发布时间】:2011-06-07 22:21:15
【问题描述】:

我是 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 个)上剪切和粘贴相同的函数,但随后更改了文本框的名称.当文本框都是不同的名称时,如何避免代码重复?

【问题讨论】:

    标签: code-duplication


    【解决方案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);
        } 
    }
    

    此代码未经测试,您可能需要传入 List byref 以便您可以写回文本框。

    此外,该列表可能需要在页面级别静态定义...如果没有进行一些测试并完全理解这些方法的用例,我不能 100% 确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多