C#Propertygrid默认值类型转换器

C#Propertygrid默认值类型转换器,c#,winforms,propertygrid,C#,Winforms,Propertygrid,我有一个带下拉框的propertygrid。在我的应用程序中,用户可以单击块,然后该块的属性显示在propertygrid中。但是,当他们第一次单击块时,下拉列表中会显示一个无效值(0)。如何确保显示有效值 下面是TypeConverter的一些代码: public class DynamicFormScreenId : Int32Converter { public override bool GetStandardValuesSupported(ITypeDescriptorCon

我有一个带下拉框的propertygrid。在我的应用程序中,用户可以单击块,然后该块的属性显示在propertygrid中。但是,当他们第一次单击块时,下拉列表中会显示一个无效值(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;
    }
}
解决方案

我在构造函数中设置了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"]);
        }
    }
}
您试过System.ComponentModel中的吗

从MSDN:

可以创建DefaultValueAttribute 有任何价值。会员违约 值通常是其初始值。 可视化设计器可以使用默认设置 值重置成员的值


在PropertyGrid中显示对象之前,必须指定对象的ScreenId属性值。实际上,您必须运行数据库查询两次。一旦知道要分配给ScreenId的值,同样在类型转换器中。

我知道这个属性,但关键是,这些值存储在数据库中。所以我不能说
DefaultValue=1
,因为我不知道这个值存在。PropertyGrid只显示在设置SelectedObject时对象的值。它使用反射来访问ScreenId以获取值。因此,您可以在ScreenId get{}中实现从数据库延迟加载值。在我的get中,我无法访问StandardValues集合。我不能这样做:get{return(int)SomeCollection[0];}你的建议/意思是什么?Martijn,当用户单击块时,一定有一些相关的块对象实例。这是我希望您传递给SelectedObject的对象。为什么不能在这个实例的Get属性中从数据库加载默认值?对不起,如果我完全误解了你的意思,请告诉我,我将不再浪费你的时间,删除这个答案。很高兴你解决了这个问题。任何时候使用反射创建对象时,通常都需要对象提供默认(无参数)构造函数。正如您所发现的,这是初始化属性和字段的最佳位置。
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"]);
        }
    }
}
private bool myVal=false;

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