#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
для задания значения вашего свойства.