求助:如何定义让PropertyGrid控件显示[...]按钮,并且点击后弹出自定义窗口(或执行自定义过程)的属性?(用C#语言实现)

Lixin19821010 2007-11-18 09:32:41
各位专家,您好:
最近遇到了一点问题,好几天都没有解决.请各位专家给些建设性的指导意见.谢谢.
比如.我们在FORM1.CS[DESIGN]上拖放一个PROPERTYGRID控件,而这个控件有FONT的这样的一个属性,点击FONT后面[...],我们看到一个弹出的界面,上面有"字体","字形","大小"等等.
我现在想做的就是,通过点[...]出现一个自己定义的界面(当然不是在FONT属性后),这个界面上有TEXTBOX,COMBOBOX等控件,然后得到TEXTBOX,COMBOBOX所输入的值.插入数据库当中.
如果有什么说的不清楚的地方,请提醒.谢谢.
十分感谢各位专家,技术上的带头大哥.谢谢.
QQ:147370451. MSN:LIXIN19821010@HOTMAIL.COM.
...全文
893 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lixin19821010 2007-11-22
  • 打赏
  • 举报
回复
:)
Lixin19821010 2007-11-21
  • 打赏
  • 举报
回复
其实业务逻辑并不复杂,但是设计了好几个方案.感觉比较满意的:
一是HBXTLHX您提到的,但是自己整了很长时间,想对数组中的数据进行一一弹出界面,然后修改,没有什么进展.
二是我上面贴子的代码,能够符合要求,但是问题在于界面就没自定义的友好,对于用户来说则需要进行使用培训.
不管如何, 十分感谢HBXTLHX您的帮助.
Lixin19821010 2007-11-20
  • 打赏
  • 举报
回复
VS2005的PROPERTYGRID控件是不是不支持对数组型的数据进行单一修改(即对数组的某一个元素出现[...]修改属性)?
Lixin19821010 2007-11-20
  • 打赏
  • 举报
回复
十分感谢hbxtlhx的回答.
今天早上一来就试了一下您的代码,结果是:十分HAPPY.
但是还有一个小小的问题:
[EditorAttribute(typeof(myeditor), typeof(System.Drawing.Design.UITypeEditor))]
public youType youProperty
{
get{...}
set{...}
}

在这里,我用一个INT类型,没有任何问题.编译器完全被玩弄与孤掌中.演示的结果完全在预料之中.
可是又试了一下STRING[]类型,好象就不行了.具体代码如下:
private string[] _Name1 = new string[10] {"'C2=','乙烯',0,0", "'C3=','丙烯',0,0", "'BUT','丁二烯',0,0",
"'CBU','聚丁二烯',0,0","'C41','丁烯—1',0,0", "'C42','丁烯—2',0,0", "'IC4','异丁烯',0,0",
"'CIC','粗异丁烯',0,0", "'STR','苯乙烯',0,0", "'SBT','苯乙烯B-T',0,0" };
[CategoryAttribute("产品类型集合"), DisplayName("'CET','二、化工原料类小计'"), ReadOnlyAttribute(false)]
[EditorAttribute(typeof(myeditor), typeof(System.Drawing.Design.UITypeEditor))]
public string[] Name1
{
get
{
return _Name1;
}
set { this._Name1 = value; }
}
具体所指:点[...]可以弹出对话框.但是我需要的是在每个STRING后面显示[...],对每个STRING进行修改,插入操作.
现在我也在TROUBLE SHOOTING.如果您或者各位专家有空,闲暇时间,是否也可以帮帮小弟.
十分感谢各位的关注
北京的雾霾天 2007-11-20
  • 打赏
  • 举报
回复
弹出自定义对话框后的操作及逻辑取决于楼主的业务逻辑,可帮性不大了。
北京的雾霾天 2007-11-19
  • 打赏
  • 举报
回复
首先定义自己要弹出的窗体,比如myform:

public partial class myform: Form
{
....//your code here
}


从UITypeEditor继承一个自定义属性编辑管理器类,参考如下:

internal class myeditor : UITypeEditor
{
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
myform f = new myform();
// your setting here
edSvc.ShowDialog(f);
}
return value;
}
public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context)
{
return false;
}
}


在类的成员属性上指定所需的属性,如:

[EditorAttribute(typeof(myeditor), typeof(System.Drawing.Design.UITypeEditor))]
public youType youProperty
{
get{...}
set{...}
}


在窗体上放好PropertyGrid,然后把你的类实例化后让PropertyGrid来显示设置就可以看到自定义的窗体了。
Lixin19821010 2007-11-19
  • 打赏
  • 举报
回复
不知道有没有什么文档比较适合(C#语言),请大家推荐一下.谢谢
Lixin19821010 2007-11-19
  • 打赏
  • 举报
回复
刚刚自己乱做了一个,勉强能实现功能,贴上来,给大家群起而乐之. :)
class ArrayValueShow
{
private static ArrayValue y1 = new ArrayValue();
private static ArrayValue y2 = new ArrayValue();
private ArrayValue[] _Members = new ArrayValue[] { y1, y2 };
public ArrayValue[] Members
{
get
{
return _Members;
}
set
{
_Members = value;
}
}
}

class ArrayValue
{
public bool _ID;
public string _Name;
public string _Height;
public bool _Age;

public ArrayValue()
{
this._ID = false;
this._Name = "1010";
this._Height = "1010";
this._Age = false;
}

[DefaultValueAttribute(false)]
public bool ID
{
get { return this._ID; }
set { this._ID = value; }
}
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
public string Height
{
get { return this._Height; }
set { this._Height = value; }
}
[DefaultValueAttribute(0)]
public bool Age
{
get { return this._Age; }
set { this._Age = value; }
}
}
在前面实例化一下ArrayValueShow这个类,把他赋值给PROPERTYGRID的SELECTEDOBJECT.便可实现.
希望小弟在此能够达到抛砖引玉的效果.
谢谢大家关注.
Lixin19821010 2007-11-19
  • 打赏
  • 举报
回复
十分感谢hbxtlhx的回答.
另外还有一个比较傻的问题.
在点[...]弹出的页面中,其中分左右两边, 比如左边是:ITEM1,ITEM2,右边是ITEM1,ITEM2的TEXT,VALUE等属性.这是如何实现的.
我总是只能得到左边变量的值.
在加入[EditorAttribute(typeof(ListItemsCollectionEditor), typeof(UITypeEditor))]这句话.以下是我写的.
private ListItemsCollectionEditor _Items;
[EditorAttribute(typeof(ListItemsCollectionEditor), typeof(UITypeEditor))]
public ListItemsCollectionEditor Items
{
get
{
return this._Items;
}
set
{
this._Items = value;
}
}
虽然知道是错了,但是由于对这东西不熟悉,很多东西不懂,不知道错在哪里,请教,谢谢

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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