Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在属性网格中实现StringFormat?_.net_Vb.net_Winforms_Class_User Controls - Fatal编程技术网

.net 如何在属性网格中实现StringFormat?

.net 如何在属性网格中实现StringFormat?,.net,vb.net,winforms,class,user-controls,.net,Vb.net,Winforms,Class,User Controls,情景 我对一个控件进行了子分类,我想在控件的属性网格中添加一个StringFormat可扩展组,以便在设计时设置其值 问题 我无法将StringFormat属性正确添加到属性网格中,这是我得到的: 问题: 将StringFormat实现为PropertyGrid的最简单方法是什么 代码 我在这里尝试了@puropoix answer的建议:(当然我做错了) 我倾向于避免使用TypeConverter,在这种情况下,可以用一种更简单的方法来实现,因为我不确定这个实现是否需要这种头痛 Public

情景

我对一个控件进行了子分类,我想在控件的属性网格中添加一个
StringFormat
可扩展组,以便在设计时设置其值

问题

我无法将StringFormat属性正确添加到属性网格中,这是我得到的:

问题:

StringFormat
实现为
PropertyGrid
的最简单方法是什么

代码

我在这里尝试了@puropoix answer的建议:(当然我做错了)

我倾向于避免使用
TypeConverter
,在这种情况下,可以用一种更简单的方法来实现,因为我不确定这个实现是否需要这种头痛

Public Class MyControl: Inherits ListBox

    Public Property MyProperty As MyStringFormat = New MyStringFormat

End Class

<TypeConverter(GetType(StringFormatConverter))>
Public Class MyStringFormat

    <Browsable(True)>
    <NotifyParentProperty(True)>
    <EditorBrowsable(EditorBrowsableState.Always)>
    Public Property myStringFormat As StringFormat

    Public Sub New()
        ' default values, if any
        myStringFormat = New StringFormat
    End Sub

End Class

Public Class StringFormatConverter : Inherits ExpandableObjectConverter

    Public Overrides Function ConvertTo(context As ITypeDescriptorContext,
                                        culture As Globalization.CultureInfo,
                                        value As Object,
                                        destinationType As Type) As Object

        Return MyBase.ConvertTo(context, culture, value, destinationType)

    End Function

End Class
公共类MyControl:继承列表框
公共属性MyProperty As MyStringFormat=新MyStringFormat
末级
公共类MyStringFormat
公共属性myStringFormat作为StringFormat
公共分新()
'默认值(如果有)
myStringFormat=新的StringFormat
端接头
末级
公共类StringFormatConverter:继承ExpandableObjectConverter
公共重写函数ConvertTo(上下文为ITypeDescriptorContext,
作为全球化的文化,
价值作为客体,
destinationType作为类型)作为对象
返回MyBase.ConvertTo(上下文、区域性、值、destinationType)
端函数
末级

继您之前的历险之后,您需要的就是这些:

控件上的属性 将公共属性TextFormat设置为TextFormat “一定要举例说明! 'TextFormating=新的TextFormat 使用组件方法:

公共类文本格式
继承组件
公共财产定线为直线定线
公共财产直线排列为直线排列
公共财产的削减
公共属性FormatFlags作为StringFormatFlags
末级
添加您想要的任何其他属性。您可以继承,因为它是一个密封的类,而且它没有您需要的所有属性。您不会喜欢
StringFormatFlags
属性的默认行为;如果你认为类型转换器令人头痛,那你就可以享受了


由于
StringFormatFlags
是一个标志枚举,您可能希望一次拾取并组合多个标志枚举。默认的UITypeEditor是一个下拉列表,但我们需要一个下拉列表。为此,我们需要一个自定义UITypeEditor。这些并不像听起来那么可怕,但也没有必要重现车轮:

关于CodeProject的文章是一个集合编辑器框架,它还包括一个EnumTypeEditor(滚动到文章末尾,顺便提到它)。在本文的中间部分,还有一个关于
类型转换器的简短入门

要使用它:
-下载文件并将DLL包含在项目中
-然后(重新)装饰您的
TextFormat.TextFormatFlags
属性:


公共属性TextFormatFlags作为StringFormatFlags
(注意添加的
UIEnumEditor
属性)

本文和演示展示了如何继承基本编辑器来定制一些东西。它将要做的一件事是使用
描述
而不是列表中的枚举名称(如果它们存在并且需要的话)。就这样,通过两个步骤,您可以检查要组合的标志:


您不需要为此类型转换器,因为将4个属性组合成一个字符串没有多大意义。与以前一样,当您的类型继承组件时,它仍然会有空/额外下拉列表。

您能让您的示例不那么抽象吗?一方面,你不需要一个可扩展的转换器,另一方面,你的转换器什么都不做。我不确定是否需要它,因为大多数用于道具栅格的转换器都是ToString和FromString。我想知道你到底想要什么-字符串格式掩码或格式标志?谢谢你的评论。我希望继承所需的类(或其他东西),我可以立即将组中
StringFormat
类的所有属性成员添加到网格中,而无需付出更多的努力,因为如果我需要实现它,那么我已经可以自己手动创建每个属性了,我想问的是,是否可以动态执行,但如果将整个
StringFormat
类属性同时实现到网格中比看起来更困难,那么我需要更多的道具:
Alignment、FormatFlags、LineInputAlignment、Trimming
Ok,这样您就可以将其制作成包含这4个道具的expando。没有为StringFormat定义TypeConverter或UITypeEditor,因此您需要编写自己的类(此外,它是一个密封类)。但由于FormatFlags是一个按位枚举,您可能必须为它实现UITypeEditor。(我假设LineInputAlignment==LineAlignment)。您的意思是什么?:,我以前从未见过,lol。类型转换器或继承组件,因为您的类型将包含4个要编辑的内容。很抱歉,我的下一个快速且可能不相关的问题,但如果您能给出一个简短的回答:我需要一个typeconverter来从一个从组件类继承的类中完全删除摘要信息(见属性网格)?或者它只适用于expandoObject?上面没有摘要,因为我跳过了上一段中描述的TypeConverter。您将获得显示内容的属性,因为它们必须显示它们所持有的内容。是。。但我问这个问题是因为我的其他问题,您在其中回答并提到,那么,如果我想完全删除摘要信息而不是默认显示名称空间,您能澄清一下我需要使用的是TypeCo吗