我有一种情况,我的表单上的几个选项卡上有几个(现在假设是 10 个)DevExpress LookUpEdit 控件(有点像 Windows 的 DropDown 控件)。所有这 10 个控件都是相同的,因为它们使用相同的数据源来获取信息。我想要做的是,如果 10 个控件中的任何一个中的值发生变化,那么我希望它在其他 9 个控件中也发生变化。因为我的表单上有其他这种类型的控件,我不想更改,所以我只是向Tag
属性添加了一个字符串值,并有一个方法搜索这种类型的所有控件,并将 Tag 属性设置为特定的字符串。
我最初以为我可以创建一个通用方法来更改所有其他控件的文本并将其分配给TextChanged
每个控件的事件,但我很快发现,一旦我将一个控件的值分配给它们,它们就会相互抵消另一个(因为本质上,一旦我更改了一个控件的值,它就会调用相同的方法并尝试更改其余部分)。
抱歉,如果它令人困惑,但这里有一些关于我正在尝试做的代码......现在,假设我只有 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
是一个简单的方法,它返回给定控件的所有控件,包括子控件:
/// <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
再次被触发并基本上取消自身的地方。
关于如何实现这一点的任何帮助或指导都会很棒。