3

フォームの複数のタブにいくつか (今のところ 10 としましょう) DevExpress LookUpEdit コントロール (Windows の DropDown コントロールのようなもの) がある状況があります。これらの 10 のコントロールはすべて、同じデータ ソースを使用して情報を取得するという点で同じです。私がやろうとしているのは、10 個のコントロールのいずれかで値が変更された場合、他の 9 個のコントロールでも値を変更したいということです。変更したくないこのタイプのコントロールがフォームに他にもあるため、プロパティに文字列値を追加Tagし、Tag プロパティを特定の文字列に設定して、このタイプのすべてのコントロールを検索するメソッドを用意しました。

TextChanged最初は、他のすべてのコントロールのテキストを変更し、それを各コントロールのイベントに割り当てるジェネリック メソッドを作成できるのではないかと考えていましたが、1 つのコントロールの値を別のもの (本質的に、1 つのコントロールの値を変更すると、同じメソッドが呼び出され、残りの値を変更しようとするため)。

わかりにくい場合は申し訳ありませんが、ここに私がやろうとしていることに関するいくつかのコードがあります...今のところ、2つのコントロールしかないとしましょう...lookupWeightそしてlookupBicycleWeight. それぞれのTextChangedイベントで、私はこれを持っています:

    private void OnLookupWeight_TextChanged(object sender, EventArgs e)
    {
        OnLookupWeight_TextChanged<LookUpEdit>(sender, e);
    }

これはこれを呼び出します:

    private void OnLookupWeight_TextChanged<T>(object sender, EventArgs e)
    {
        var controls = GetAll(tabPageSpecifications, typeof(T));

        foreach (var control in controls)
        {
            if (control.Tag != null)
                if (control.Tag.ToString() == "Weight")
                    if(control.Name != (sender as LookUpEdit).Name)
                        (control as LookUpEdit).EditValue = (sender as LookUpEdit).Text;
        }

    }

GetAllサブコントロールを含む、指定された Control のすべてのコントロールを返す単純なメソッドです。

    /// <summary>
    /// method to get all child & sub-child controls within a control by type
    /// </summary>
    /// <param name="control">the control we're searching in (use this for the form)</param>
    /// <param name="type">The control type we're looking for (i.e; TextBox)</param>
    /// <returns></returns>
    public IEnumerable<Control> GetAll(Control control, Type type = null)
    {
        var controls = control.Controls.Cast<Control>();
        //check the all value, if true then get all the controls
        //otherwise get the controls of the specified type
        if (type == null)
            return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls);
        else
            return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls).Where(c => c.GetType() == type);
    }

OnLookupWeight_TextChanged型にキャストしたため、メソッドが完全に汎用的ではないことはわかっていLookupEditますが、戻って変更する前に、この時点でこれを機能させようとしています。

ご覧のとおり、行if(control.Name != (sender as LookUpEdit).Name)は がOnLookupWeight_TextChanged再び起動され、基本的にそれ自体をキャンセルする場所です。

これを達成する方法についての助けや方向性は素晴らしいでしょう。

4

3 に答える 3

0

OnLookupWeight_TextChanged のコードは、コントロールのテキストがそのルーチン内から変更されたときに実行されるべきではないようです。外部から変更が加えられた場合を除き、インスタンス変数を使用して実行を無効にすることができます。例えば:

    private Boolean InProgress;
    private void OnLookupWeight_TextChanged<T>(object sender, EventArgs e)
    {
        if (!InProgress)
        {
            InProgress=true;
            var controls = GetAll(tabPageSpecifications, typeof(T));

            foreach (var control in controls)
            {
                 if (control.Tag != null)
                     if (control.Tag.ToString() == "Weight")
                         if(control.Name != (sender as LookUpEdit).Name)
                             (control as LookUpEdit).EditValue = (sender as LookUpEdit).Text;
            }
            InProgress = false;
        }
    }
于 2013-05-04T02:53:30.740 に答える
0

10 個のコントロールすべてに同じバインディング ソースを使用しないのはなぜですか?

それらのいずれかで選択した値を変更すると、すべてが変更されます。

于 2013-05-06T13:17:29.993 に答える