Преобразователь типов значения по умолчанию в Propertygrid в C #

У меня есть сетка свойств с раскрывающимся списком. В моем приложении пользователь может щелкнуть блок, а затем свойства этого блока отображаются в таблице свойств. Но при первом щелчке по блоку в раскрывающемся списке отображается недопустимое значение (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;
    }
}

И недвижимость в моем классе:

[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"]);
        }
    }
}

person Martijn    schedule 11.01.2010    source источник


Ответы (2)


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

Из MSDN:

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

private bool myVal=false;

[DefaultValue(false)]
 public bool MyProperty {
    get {
       return myVal;
    }
    set {
       myVal=value;
    }
 }
person Ash    schedule 11.01.2010
comment
Я знаю об этом атрибуте, но дело в том, что значения хранятся в базе данных. Поэтому я не могу сказать DefaultValue = 1, потому что не знаю, существует ли это значение. - person Martijn; 11.01.2010
comment
PropertryGrid просто показывает значения объекта в то время, когда вы устанавливаете SelectedObject. Он использует отражение для доступа к ScreenId для получения значения. Поэтому вы можете просто реализовать отложенную загрузку значения из базы данных в вашем ScreenId get {}. - person Ash; 11.01.2010
comment
Я не совсем понимаю. В моем случае я не могу получить доступ к коллекции StandardValuesCollection. Я не могу сделать что-то вроде этого: get {return (int) SomeCollection [0];} Что вы предлагаете / имеете в виду? - person Martijn; 11.01.2010
comment
Martijn, когда пользователь нажимает на блок, должен быть какой-то связанный экземпляр объекта блока. Это объект, который, как я ожидал, вы передадите в SelectedObject. Почему вы не можете просто загрузить значение по умолчанию из базы данных в свойстве Get этого экземпляра? Извините, если я вас полностью не понял, дайте мне знать, и я перестану тратить ваше время и удалю этот ответ. - person Ash; 11.01.2010
comment
Рад, что ты решил это. Каждый раз, когда для создания объекта используется отражение, обычно требуется, чтобы ваш объект предоставил конструктор по умолчанию (без параметров). Как вы выяснили, это лучшее место для инициализации свойств и полей. - person Ash; 12.01.2010

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

person Hans Passant    schedule 11.01.2010