在自定义UserControl上使用反射设置自定义属性

时间:2018-11-13 11:20:32

标签: c# reflection

我需要使用反射来设置自定义userControls的两个自定义属性

CustomUserControl.cs

......

public string _ValidaMsg { get { return _ValidarMsg; } set { _ValidarMsg = value; } }
public bool _Valida { get { return _Validar; } set { _Validar = value;} }

._Valida确定提交表单之前是否需要验证控件 ._ValidaMsg是该字段未填写时显示的消息

在form.cs中,我有一个名为listaMetodo (String ControlName,String ControlText,Type Control.Type)的类型列表,这是我填写列表的方法

 private List<xEntidades.entControlValidacion> GetAllControls(Control container)
    {
        foreach (Control c in container.Controls)
        {
            GetAllControls(c);
            // these txtDescripcion and others are the diferent types of my customs UserControls
            if (c.Name.Equals("txtDescripcion") || c.Name.Equals("Combo") || c.Name.Equals("txtCodigo") || c.Name.Equals("txtFecha"))
            {

                    listaMetodo.Add(new xEntidades.entControlValidacion(c.Parent.Name, c.Text, c.GetType()));

            }

        }

        return listaMetodo;
    }

因此,一旦有了包含所有相关控件的列表,我要做的就是将其与我拥有的列表进行比较,其中充满了需要验证的所有控件,我们将其称为{{1 }}。 在for循环中同时迭代两个列表时,我有条件

validateList(string NameOfControl,bool Valida , String ValidaMsg)

因此,如何使用存储在我的列表中的Type和ControlName修改实例对象的属性 使用反射是强制性的吗?是否有另一个解决方案可以实现我的目标? 我也正在使用Framework 2.0 预先感谢

1 个答案:

答案 0 :(得分:0)

终于我实现了我想要创建此方法的目的

     private void validaControles()
        {
            for (int j = 0; j < listaMetodo.Count; j++)
            {
                for (int k = 0; k < listaControlesValida.Count; k++)
                {

//just ignore this condition


if(listaMetodo[j].NombrePadre.Equals(listaControlesValida[k].Control) && listaControlesValida[k].Valida && listaMetodo[j].TextoControl.Equals("")){

                   listaControlesValida[k].ValidaText, null);
                        Control[] control = this.Controls.Find(listaMetodo[j].NombrePadre, true);
                        Type type = control[0].GetType();

                       control[0].GetType().GetProperty("_ValidaMsg").SetValue(control[0], listaControlesValida[k].ValidaText, null);
                       control[0].GetType().GetProperty("_Valida").SetValue(control[0], true, null);
                    }
                }
            }
        }