Intereting Posts
c # динамически переименовывать файл после запроса на загрузку Xamarin: индексирование вертикального алфавита (список переходов) для сгруппированного списка в форматах Xamarin для Android и Windows UWP Получить имя продукта из файла msi в C # Изменение файла конфигурации app.configuration в процессе установки с установщиком визуальной студии не удается: не удалось загрузить файл или сборку «EntityFramework» Значение по умолчанию для родового типа? Аутентификация Office 365 / EWS с использованием OAuth Эффективный способ объединения нескольких текстовых файлов C # – не удается получить доступ ко всем файлам Entity Framework Добавить, если не существует без обновления Сериализация в C # без использования файловой системы facebook c # sdk – Пользователь не разрешил приложению выполнять это действие Строка рисования с нормированной научной нотацией (надстрочная) Генерация двоичных патчей в C # Почему Assert.AreEqual (T obj1, Tobj2) терпит неудачу с идентичными объектами XML-анализатор SAX для сценариев с использованием отражения

C # Propertygrid значение по умолчанию typeconverter

У меня есть свойствоgrid с раскрывающимся списком. В моем приложении пользователь может щелкнуть по блоку, а затем свойства этого блока отображаются в свойствах. Но при первом нажатии на блок в выпадающем списке отображается недопустимое значение (0). Как я могу убедиться, что отображается действительное значение?

Вот какой код TypeConverter:

public class DynamicFormScreenId : Int32Converter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { Database database = new Database(); database.StoredProcedureName = "SP naam"; int[] id = null; if (database.ExecuteStoredProcedure()) { int totalIds = database.DataTable.Rows.Count; id = new int[totalIds]; for (int i = 0; i < totalIds; i++) { id[i] = Convert.ToInt32(database.DataTable.Rows[i][0]); } } return new StandardValuesCollection(id); } public override bool GetStandardValuesExclusive( ITypeDescriptorContext context) { return true; } } 

И свойство в моем classе:

 [TypeConverter(typeof(DynamicFormScreenId)), CategoryAttribute("Screen Settings"), Description("The id of the screen")] public int ScreenId { get { return _screenId; } set { _screenId = value; } } 

РЕШЕНИЕ

Я установил значение по умолчанию для ScreenId в конструкторе:

 private void Constructor(string name) { _controlName = name; // Set screenId default value Database database = new Database("connectionstring"); database.StoredProcedureName = "mySP"; if (database.ExecuteStoredProcedure()) { if (database.DataTable.Rows.Count > 0) { _screenId = Convert.ToInt32(database.DataTable.Rows[0]["id"]); } } } 

Вы пробовали параметр DefaultValueAttribute в System.ComponentModel?

Из MSDN:

Вы можете создать атрибут DefaultValueAttribute с любым значением. Значение по умолчанию для члена обычно является его начальным значением. Визуальный конструктор может использовать значение по умолчанию для сброса значения члена.

 private bool myVal=false; [DefaultValue(false)] public bool MyProperty { get { return myVal; } set { myVal=value; } } 

Вам нужно будет присвоить значение свойства ScreenId объекта, прежде чем показывать его в PropertyGrid. По сути, вам нужно дважды запустить запрос dbase. Однажды, чтобы узнать, какое значение назначить ScreenId, снова в преобразователе типов.