1

私は 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 個) で同じ関数をカット アンド ペーストし、テキスト ボックスの名前を変更していることに気づきました。テキストボックスの名前がす​​べて異なる場合、コードの重複をどのように回避しますか?

4

1 に答える 1

1

すべてのページのテキストボックスを正規化し、それらのメソッドを基本クラスにプッシュしない限り、簡単に修正することはできません。

メソッドを基本クラスにプッシュし、メソッドのシグネチャを変更してリストを取得し、ページレベルでリストを作成するメソッドを作成するなどの方法を実行できます。

ロジックの重複を減らす必要がありますが、まだいくつかのコードを書く必要があります。

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

このコードはテストされていないため、テキストボックスに書き戻すことができるように、Listbyrefを渡す必要がある場合があります。

また、そのリストはページレベルで静的に定義する必要があるかもしれません...いくつかのテストを行わず、メソッドのユースケースを完全に理解していなければ、100%確信はありません。

于 2011-06-07T22:45:50.847 に答える