【问题标题】:C# Propertygrid default value typeconverterC# Propertygrid 默认值类型转换器
【发布时间】:2010-01-11 08:26:45
【问题描述】:

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

【问题讨论】:

    标签: c# winforms propertygrid


    【解决方案1】:

    您尝试过 System.ComponentModel 中的DefaultValueAttribute 吗?

    来自 MSDN:

    您可以创建一个 DefaultValueAttribute 具有任何价值。会员默认 value 通常是它的初始值。 视觉设计师可以使用默认 value 来重置成员的值。

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

    【讨论】:

    • 我知道这个属性,但关键是,这些值存储在数据库中。所以我不能说DefaultValue = 1,因为我不知道这个值存在。
    • PropertryGrid 仅在您设置 SelectedObject 时显示对象的值。它使用反射来访问 ScreenId 以获取值。因此,您可以在 ScreenId get {} 中实现数据库中值的延迟加载。
    • 我不完全明白。在我的获取中,我无法访问 StandardValuesCollection。我不能这样做:get {return (int)SomeCollection[0];} 你有什么建议/意思?
    • Martijn,当用户点击区块时,一定有一些相关的区块对象实例。这是我希望您传递给 SelectedObject 的对象。为什么不能在该实例的 Get 属性中从数据库中加载默认值?抱歉,如果我完全误解了您,请告诉我,我将停止浪费您的时间并删除此答案。
    • 很高兴你已经解决了。任何时候反射被用来创建一个对象,它通常需要你的对象提供一个默认的(无参数的)构造函数。如您所见,这是初始化属性和字段的最佳位置。
    【解决方案2】:

    您必须先分配对象的 ScreenId 属性值,然后才能在 PropertyGrid 中显示它。实际上,您必须运行 dbase 查询两次。一旦知道要为 ScreenId 分配什么值,再次在类型转换器中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多