在C#中按字符串查找控件的属性

本文关键字:控件 属性 查找 字符串 | 更新日期: 2023-09-27 17:57:36

我知道这个问题被问了一百万次,但我不知道如何定义我的搜索,所以请耐心等待
我想制作一个方法,该方法将在控制动态上设置一些特性,参考发送给方法的刺痛。

像这个

public void SetGridColumnProperty(ref DataGridView grid,string columnName, string propretyName, string propertyValue  )
        {
           grid.Columns[columnName].("I know this can't be done as this") = propertyValue;
        }

如果我的问题难以理解,我深表歉意,
这是我想做的
我正在制作WinForms应用程序,它使用大量的数据网格视图来显示和编辑数据
由于我需要经常更改网格的外观,添加列编辑顺序等。我的想法是为表单上的每个DataGird保存某种元数据,当我在加载之前向用户显示表单时我的表单通过连接元数据和特定网格的属性来设置网格的属性
我想在XML或数据库中将配置文件与实际代码分开,这样当我对应用程序进行编辑时,我就不必重新编译新代码,只需更改我的XML,在下一次提交时,它看起来就像我喜欢一样

在C#中按字符串查找控件的属性

首先,不需要使用ref关键字,因为DataGridView是引用类型。其次,这里是解决方案:

    public void SetGridColumnProperty(DataGridView grid, string columnName, string propertyName, object propertyValue)
    {
        DataGridViewColumn dgvColumn = grid.Columns[columnName];
        typeof(DataGridViewColumn).GetProperty(propertyName).SetValue(dgvColumn, propertyValue, null);
    }

样品:

SetGridColumnProperty(dataGridView1, "ColumnName", "Width", 500);

Update:在调用SetValue方法之前,请检查PropertyInfo类的CanWrite属性。

好吧,您正在讨论反射。您可以查找大量引用反射命名空间的资源。

为了让你开始设置一个你可能想要的属性,你可以按照以下行使用MethodInfo:

MethodInfo invokedMethod = grid.GetType().GetProperty("propertyName").GetSetMethod();                    
invokedMethod.Invoke(targetObject, parameters);

您可以使用PropertyInfo来获取控件的属性并将其值分配给

public void SetGridColumnProperty(ref DataGridView grid,string columnName, string propretyName, string propertyValue  )
        {
            PropertyInfo pInfo =  grid.GetType().GetProperty(propretyName);
            if (pInfo != null)
            {
               TypeConverter tc = TypeDescriptor.GetConverter(pInfo.PropertyType);
               if (tc.CanConvertFrom(Type.GetType(propertyValue.GetType().ToString())))
               {
                   valToSet = tc.ConvertFromString(propertyValue);
                   pInfo.SetValue(grid, valToSet, null);
               }
            }
        }

希望这对有帮助

这可以使用反射来完成,请查看所需类型的GetProperties。这将为每个属性返回一个PropertyInfo对象数组。检查所需属性的CanWrite是否返回true,然后使用SetValue设置属性值。