1、已经设置和那个表中的那个字段显示的值有哪些,这个数据是存在数据库的,用数据库的表名和字段名称能找到这个字段可以显示的值.2、而数据中的有些基础数据表都对应了一个实体类,这些也已经做好3、我写了两个类
一个是继承自TypeConverter,用于控制属性为下拉属性
class MyConverter:TypeConverter
{
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        List<string> lstValues = CommonDropDownValue.GetData(MyParam.TableName, MyParam.FieldName);      
        return new StandardValuesCollection(lstValues.ToArray());
    }    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return CommonDropDownValue.AllowInput;
    }    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
}
二个是传递参数的类,类里用的是静态成员
class MyParam
{
    private static string strTableName;
    private static string strFieldName;
    public static string TableName
    {
        get { return strTableName; }
        set { strTableName = value; }
    }    public static string FieldName
    {
        get { return strFieldName; }
        set { strFieldName = value; }
    }
    public static List<string> GetData()//获取数据库表中字段对应的值
    {
        List<string> Result = new List<string>();
        DataSet ds = ds = DbHelper.getDataSet(strTableName, strFieldName);//用于获取数据的
        //////////////////////////////////////相关代码,这里不再写了
    
        //////////////////////////////////////
        return Result;
    }
}
而使用的时候是这样的,我在这里举个例子:
class MyObject//实体类
{
    private string strClass;
    
    [TypeConverter(typeof(MyConverter))]
    public string ClassName
    {
        get{return strClass;}
        set{strClass = value;}
    }
    
    //。。可能有一个类有几个都要配置成可以动态属性值的
}
调用代码
MyParam.TableName = "班级表";
MyParam.FieldName = "班级";//设置参数
MyObject obj = new MyObject();
this.PropertyGrid1.SelectedObject = obj;现在的问题是如果一个实体类中只有一个需要弄成动态的属性,那我的这个方法可以实现,但是有多个的话就不行了,因为参数是上面那样的,所以请教一下各位应该怎么弄,希望能提供一下思路!!!!!!

解决方案 »

  1.   

    问题出在用静态的strTableName限制了你的使用。解决方法是用Attribute来标志某属性该用的表和列:
    [DbColumn(TableName = "table1", FieldName = "column8")]  //<---
    [TypeConverter(typeof(MyConverter))]
    public string ClassName
    {
        //...
    }class DbColumnAttribute : Attribute
    {
        public string TableName { get; set; }
        public string FieldName { get; set; }
    }class MyConverter:TypeConverter
    {
      public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
      {
        DbColumnAttribute db = context.PropertyDescriptor.Attributes[typeof(DbColumnAttribute)] as DbColumnAttribute;  //<---
        List<string> lstValues = CommonDropDownValue.GetData(db.TableName, db.FieldName);   //<---
        return new StandardValuesCollection(lstValues.ToArray());
      }
      //...
    }
      

  2.   

    不愧是三星用户,我也知道用静态变量对于我的这种情况是不行的,呵呵,水平有限,这次受教了,多谢 gomoku !!!!!!!!!
    谁还有办法如果不介意的话也可以拿来分享一下,我在此多谢了
      

  3.   

    还有就是继承自TypeConverter的类型转换器,怎么只能选择,不让输入,有什么办法能让用户输入值呢?????
      

  4.   

            public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
            {
                //true下拉框不可编辑
                return false;
            }
      

  5.   

    继承 UITypeEditor 写属性编辑器。查一下msdn有帮助,需要实现editvalue,getedittype好像。
      

  6.   


        public class ValueEditor : UITypeEditor
        {
            public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
            {
                return UITypeEditorEditStyle.Modal;
            }        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
            {
                if (context == null || provider == null || context.Instance == null)
                {
                    return base.EditValue(provider, value);
                }            IWindowsFormsEditorService _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));            if (_editorService == null)
                {
                    return base.EditValue(provider, value);
                }
                else
                {
    //编辑画面
                    Form fms = new Form();
                    fms.ShowDialog();
                    value = 
                }            return value;        }
        }
      

  7.   

    我这样弄了一下,返回false还是不能输入,郁闷了
    下面是我的代码:
    private string strFieldType;        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                CommonParamAttribute Param = context.PropertyDescriptor.Attributes[typeof(CommonParamAttribute)] as CommonParamAttribute;
                List<string> lstValues = this.GetData(Param.TableName, Param.FieldName);
                return new StandardValuesCollection(lstValues.ToArray());
            }        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
            {
                return false;
            }        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }
      

  8.   

    -->wsw0515  你说的这个是用一个Form作为编辑窗口, 能不能做到直接在上面编辑呢?
      

  9.   


            public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
            {
                //true下拉框不可编辑
                return false;
            }        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                //true表示显示下拉框
                return true;
            }
    这样应该就可以像输文本框一样输入了。我试了是可以的啊
      

  10.   

    我用的也是VS2005,我真的是想不通了, 能不能把你写的源代码发给我一下,我QQ:313764837
      

  11.   

    因为你有些方法还没有重写。
    最简单的解决方法就是继承StringConverter,既把你代码中的class MyConverter:TypeConverter换成:class class MyTypeConverter : StringConverter
    {
    }
      

  12.   

    果然是这个的问题,我用的是TypeConverter,不过用TypeConverter应该也可以,就像楼上说的,应该是有点方法没有继承过来,我再试试
      

  13.   

    参考一下:
    C#动态创建属性
    http://dev.firnow.com/course/4_webprogram/asp.net/netjs/2007112/81905.html