关于PropertyGrid中属性的值动态从数据库取出

赤色火焰 2010-08-27 11:11:29
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;

现在的问题是如果一个实体类中只有一个需要弄成动态的属性,那我的这个方法可以实现,但是有多个的话就不行了,因为参数是上面那样的,所以请教一下各位应该怎么弄,希望能提供一下思路!!!!!!
...全文
1319 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
哥们能不能说一下怎么用啊,我不太了解
Dobzhansky 2010-08-27
  • 打赏
  • 举报
回复
类型 转换器
属性 编辑器
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
不愧是三星用户,我也知道用静态变量对于我的这种情况是不行的,呵呵,水平有限,这次受教了,多谢 gomoku !!!!!!!!!
谁还有办法如果不介意的话也可以拿来分享一下,我在此多谢了
gomoku 2010-08-27
  • 打赏
  • 举报
回复
问题出在用静态的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());
}
//...
}
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
楼上的哥们能具体说一下吗?
Dobzhansky 2010-08-27
  • 打赏
  • 举报
回复
用属性编辑器, 不要用转换器
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 computerfox 的回复:]
参考一下:
C#动态创建属性
http://dev.firnow.com/course/4_webprogram/asp.net/netjs/2007112/81905.html
[/Quote]
这个是用IL创建动态类的吧,比较复杂,其实有更简单的办法的
但我需要的是动态的属性值,不是动态属性
不过这个倒也可以学习下..........
捷哥1999 2010-08-27
  • 打赏
  • 举报
回复
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
果然是这个的问题,我用的是TypeConverter,不过用TypeConverter应该也可以,就像楼上说的,应该是有点方法没有继承过来,我再试试
gomoku 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xukuilove 的回复:]
我郁闷了,我也是这样弄的,可就是不可以,代码就是上面我贴的,汗
[/Quote]
因为你有些方法还没有重写。
最简单的解决方法就是继承StringConverter,既把你代码中的class MyConverter:TypeConverter换成:

class class MyTypeConverter : StringConverter
{
}
wsw0515 2010-08-27
  • 打赏
  • 举报
回复
StringConverter这个的问题
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
我用的也是VS2005,我真的是想不通了, 能不能把你写的源代码发给我一下,我QQ:313764837
wsw0515 2010-08-27
  • 打赏
  • 举报
回复
我用的是vs2005
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
我郁闷了,我也是这样弄的,可就是不可以,代码就是上面我贴的,汗
wsw0515 2010-08-27
  • 打赏
  • 举报
回复

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

public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
//true表示显示下拉框
return true;
}


这样应该就可以像输文本框一样输入了。我试了是可以的啊
netstree 2010-08-27
  • 打赏
  • 举报
回复
学习了。
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
-->wsw0515 你说的这个是用一个Form作为编辑窗口, 能不能做到直接在上面编辑呢?
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wsw0515 的回复:]
引用 7 楼 xukuilove 的回复:
还有就是继承自TypeConverter的类型转换器,怎么只能选择,不让输入,有什么办法能让用户输入值呢?????


C# code
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
……
[/Quote]
我这样弄了一下,返回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;
}
wsw0515 2010-08-27
  • 打赏
  • 举报
回复

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;

}
}
赤色火焰 2010-08-27
  • 打赏
  • 举报
回复
多谢楼上两位,我先看看
加载更多回复(3)

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧