如何解决C# PropertyGrid 实现一个接受规范值或表达式的属性
我正在寻找一种实现 PropertyGrid 的方法,以便用户可以输入规范值,或单击“ BIDS SSRS 允许用户执行此操作,例如,当在 PropertyGrid 中为 Color 类型完成下拉列表时,将使用以下下拉列表: 对于布尔值: 用户可以在其中单击 Expression 并构建一个将在运行时计算的表达式。我对编写表达式构建器并在运行时解析/评估它没有问题,但我不清楚与 PropertyGrid 相关的最佳编码方式。 作为测试用例,我使用 ReadOnly 属性并将其从 bool 更改为对象类型。通过这种方式,它可以接受用户输入的内容,可以是表示布尔值的字符串,也可以是 Expression 类型的对象(我必须存储表达式的类): 请注意,存储当前是在 XML 文档中完成的,我可能会更改它,而且上面的代码并不完整。 从 PropertyGrid 的角度来看,最好的管理方法是什么,在这种情况下,值是布尔值还是表达式?在其他情况下,它可能是字符串或表达式,或者字符串或表达式。 [DescriptionAttribute("Whether the user can edit the contents.")]
//[Editor(typeof(ExpressionPropertyEditor),typeof(UITypeEditor))]
[TypeConverterAttribute(typeof(ReadOnlyConverter))]
public object ReadOnly
{
get
{
try
{
bool bReadonly = false;
string cXmlPath = "";
cXmlPath = Helper.GetXmlModePathForRead(base.Xml,base.Frm.ModeCode);
if (!Dolphin.modGeneral.XMLGetValueBoolean(base.Globals,base.Xml,cXmlPath + "ReadOnly",ref bReadonly)) throw new Exception("Cannot get Readonly property from TEXTBOX control.");
return bReadonly.ToString();
}
catch (Exception ex)
{
base.Globals.Errs.Raise(ex);
throw ex;
}
}
set
{
frmExpressionEditor frm;
try
{
string cXmlPath = "";
switch ((string)value)
{
case "True":
case "False":
cXmlPath = Helper.GetXmlModePathForRead(base.Xml,base.Frm.ModeCode);
if (!Dolphin.modGeneral.XMLSetNode(base.Globals,value.ToString())) throw new Exception("Cannot set Readonly property on TEXTBOX control.");
break;
case Consts.EXPRESSION_PROPERTY_NAME:
frm = new frmExpressionEditor();
if (!frm.EditExpression(value)) throw new Exception("Could not edit Expression correctly.");
break;
}
}
catch (Exception ex)
{
base.Globals.Errs.Raise(ex);
throw ex;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。