热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

各位专家,您好:最近遇到了一点问题,好几天都没有解决.请各位专家给些建设性的指导意见.谢谢.比如.我们在FORM1.CS[DESIGN]上拖放一个PROPERTYGRID控件,
各位专家,您好:
    最近遇到了一点问题,好几天都没有解决.请各位专家给些建设性的指导意见.谢谢.
    比如.我们在FORM1.CS[DESIGN]上拖放一个PROPERTYGRID控件,而这个控件有FONT的这样的一个属性,点击FONT后面[...],我们看到一个弹出的界面,上面有"字体","字形","大小"等等.
    我现在想做的就是,通过点[...]出现一个自己定义的界面(当然不是在FONT属性后),这个界面上有TEXTBOX,COMBOBOX等控件,然后得到TEXTBOX,COMBOBOX所输入的值.插入数据库当中.
    如果有什么说的不清楚的地方,请提醒.谢谢.
    十分感谢各位专家,技术上的带头大哥.谢谢.
    QQ:147370451. MSN:LIXIN19821010@HOTMAIL.COM.

9 个解决方案

#1


不知道有没有什么文档比较适合(C#语言),请大家推荐一下.谢谢

#2


首先定义自己要弹出的窗体,比如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来显示设置就可以看到自定义的窗体了。

#3


    十分感谢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;
            }
        }
    虽然知道是错了,但是由于对这东西不熟悉,很多东西不懂,不知道错在哪里,请教,谢谢

#4


刚刚自己乱做了一个,勉强能实现功能,贴上来,给大家群起而乐之. :)
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.便可实现.
    希望小弟在此能够达到抛砖引玉的效果.
    谢谢大家关注.

#5


十分感谢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.如果您或者各位专家有空,闲暇时间,是否也可以帮帮小弟.
    十分感谢各位的关注

#6


    VS2005的PROPERTYGRID控件是不是不支持对数组型的数据进行单一修改(即对数组的某一个元素出现[...]修改属性)?

#7


弹出自定义对话框后的操作及逻辑取决于楼主的业务逻辑,可帮性不大了。

#8


其实业务逻辑并不复杂,但是设计了好几个方案.感觉比较满意的:
一是HBXTLHX您提到的,但是自己整了很长时间,想对数组中的数据进行一一弹出界面,然后修改,没有什么进展.
二是我上面贴子的代码,能够符合要求,但是问题在于界面就没自定义的友好,对于用户来说则需要进行使用培训.
不管如何, 十分感谢HBXTLHX您的帮助.

#9


:)

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
烦了_12664
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有