Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不引起不确定循环的情况下,更改特定类型的所有控件的值_C#_Winforms_Devexpress - Fatal编程技术网

C# 在不引起不确定循环的情况下,更改特定类型的所有控件的值

C# 在不引起不确定循环的情况下,更改特定类型的所有控件的值,c#,winforms,devexpress,C#,Winforms,Devexpress,我有一种情况,在我的表单的几个选项卡上有几个(比如说现在有10个)DevExpress LookUpEdit控件(有点像Windows的下拉控件)。所有10个控件都是相同的,它们使用相同的数据源从中获取信息。我想做的是,如果10个控件中有一个值发生了变化,那么我希望其他9个控件中的值也发生变化。因为我的表单上还有其他不想更改的此类控件,所以我只需向Tag属性添加一个字符串值,并在Tag属性设置为特定字符串的情况下对所有此类控件进行方法搜索 我最初认为我可能能够创建一个通用方法来更改所有其他控件的

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

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

很抱歉,如果这让人困惑,但这里有一些关于我正在尝试做什么的代码…现在,假设我只有两个控件…
lookupWeight
lookupbicyweight
。在
TextChanged
事件中,我有以下内容:

    private void OnLookupWeight_TextChanged(object sender, EventArgs e)
    {
        OnLookupWeight_TextChanged<LookUpEdit>(sender, e);
    }
我知道我的
OnLookupWeight\u TextChanged
方法不是完全通用的,因为我强制转换为
LookupEdit
类型,但我只是想在返回并更改内容之前让它在此时起作用

正如您所看到的,行
if(control.Name!=(发送方作为LookUpEdit.Name)
OnLookupWeight\u TextChanged
再次被触发的地方,它基本上会自动取消


关于如何实现这一点的任何帮助或指导都将非常有用。

只需更改那些尚未具有相同文本值的内容:

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

听起来,当控件的文本从该例程中更改时,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;
        }
    }
进程中的私有布尔值;
私有void OnLookupWeight_TextChanged(对象发送方,事件参数e)
{
如果(!InProgress)
{
InProgress=true;
var controls=GetAll(tabPageSpecifications,typeof(T));
foreach(控件中的var控件)
{
if(control.Tag!=null)
if(control.Tag.ToString()=“权重”)
if(control.Name!=(发送方为LookUpEdit.Name)
(控件作为LookUpEdit).EditValue=(发送方作为LookUpEdit).Text;
}
InProgress=假;
}
}

为什么不为所有10个控件使用相同的bindingsource


当您更改其中一个控件中的选定值时,所有选项都会更改。

我认为您需要使用数据绑定:在UI上控件之间存在复杂关系的情况下,这是最简单的解决方案。请检查是否可以使用这些控件。
    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;
    }
    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;
        }
    }