Найти свойство элемента управления по строке в C#

#c#

#c#

Вопрос:

Я знаю, что об этом спрашивали миллион раз, но я не знаю, как определить мой поиск, поэтому, пожалуйста, наберитесь терпения.
Я хочу, чтобы метод, который собирается устанавливать некоторые параметры для элемента управления, динамически ссылался на sting, отправленный методу.

что-то вроде этого

 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, которое использует множество представлений сетки данных для отображения и редактирования данных.
Поскольку мне нужно часто менять внешний вид моих поясов, добавлять столбцы, редактировать порядок и прочее, моя идея заключалась в том, чтобы хранить какие-то метаданные для каждой группы данных в форме, и когда я показываю форму пользователю, который я хочу перед загрузкой
моя форма задает свойства сетки путем объединения метаданных и свойств конкретной сетки.
Я хочу, чтобы файлы конфигурации были отделены от реального кода в XML или в базе данных, поэтому, когда я вношу изменения в свое приложение, мне не нужно перекомпилировать новый код, просто измените мой xml, и на следующем форуме загрузки он будет выглядеть так, как мне нравится

Комментарии:

1. Можете ли вы немного улучшить свой вопрос? Я не понимаю, что вы хотите сделать. И почему вы передаете grid по ссылке?

2. Используйте отражение, msdn.microsoft.com/en-us/library/cxz4wk15 (v= против 95).aspx

3. пожалуйста, перефразируйте вопрос.

4. @CodeInChaos Я отредактировал, и я думаю, что теперь это более понятно, еще раз извините,

Ответ №1:

Прежде всего, нет необходимости использовать 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);
  

Обновление: Проверьте CanWrite свойство PropertyInfo класса перед вызовом метода setValue.

Ответ №2:

Хорошо, итак, вы говорите об отражении. Вы можете просмотреть множество ресурсов, которые будут ссылаться на пространство имен Reflection.

Чтобы начать настройку свойства, которое вы, вероятно, захотите, используйте MethodInfo в следующих строках:

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

Ответ №3:

вы можете использовать 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);
               }
            }
        }
  

надеюсь, это поможет

Ответ №4:

Это можно сделать с помощью отражения, посмотрите на GetProperties, для какого типа вам это нужно. Это вернет массив объектов PropertyInfo для каждого свойства. Проверьте, CanWrite возвращает ли значение true для нужного вам свойства, а затем используйте SetValue для задания значения вашего свойства.