3

我有一种情况,我的表单上的几个选项卡上有几个(现在假设是 10 个)DevExpress LookUpEdit 控件(有点像 Windows 的 DropDown 控件)。所有这 10 个控件都是相同的,因为它们使用相同的数据源来获取信息。我想要做的是,如果 10 个控件中的任何一个中的值发生变化,那么我希望它在其他 9 个控件中也发生变化。因为我的表单上有其他这种类型的控件,我不想更改,所以我只是向Tag属性添加了一个字符串值,并有一个方法搜索这种类型的所有控件,并将 Tag 属性设置为特定的字符串。

我最初以为我可以创建一个通用方法来更改所有其他控件的文本并将其分配给TextChanged每个控件的事件,但我很快发现,一旦我将一个控件的值分配给它们,它们就会相互抵消另一个(因为本质上,一旦我更改了一个控件的值,它就会调用相同的方法并尝试更改其余部分)。

抱歉,如果它令人困惑,但这里有一些关于我正在尝试做的代码......现在,假设我只有 2 个控件......lookupWeightlookupBicycleWeight​​. 在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是一个简单的方法,它返回给定控件的所有控件,包括子控件:

    /// <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

1

只需更改尚未具有相同 Text 值的那些:

    foreach (var control in controls)
    {
        if (control.Tag != null)
            if (control.Tag.ToString() == "Weight")
                if((control as LookUpEdit).EditValue != (sender as LookUpEdit).Text)
                    (control as LookUpEdit).EditValue = (sender as LookUpEdit).Text;
    }
于 2013-05-03T16:44:00.080 回答
0

为什么不对所有 10 个控件使用相同的绑定源?

当您更改其中一个中的选定值时,所有这些都会更改。

于 2013-05-06T13:17:29.993 回答
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 回答