PropertyGrid 繫結動態的屬性與值的集合

2022-02-12 00:09:18 字數 3422 閱讀 1594

建立下面3個類:

xprop 就是使用者將具體使用的屬性。propertygrid 很炫的一點就是屬性的定製可以有很大的自由度。在這裡,給出一種最最簡單的形式,屬性包括 name 和 value 兩個部分,在 propertygrid 的屬性視窗中,name 將代表左邊的屬性名稱,value 將代表右邊的屬性值。

using system;   

using system.componentmodel;   

using system.collections.generic;   

using system.text;   

namespace customerpropertygrid   

set}   

public

object value   

set}   

public

override

string tostring()   

}   

}  這個class沒有特別的地方,對 tostring 的 overrides 是為了方便後面對整個類的內容顯示。

xpropdescriptior 是建立在 xprop 基礎上的,同時是 propertydescriptor 的乙個派生類。propertydescriptor是在 system.componentmodel 中的,包含了 propertygrid 中每個屬性所對應的各種介面。xpropdescriptior 就是把 xprop 中的屬性和這些介面對應起來。

using system;   

using system.componentmodel;   

using system.collections.generic;   

using system.text;   

namespace customerpropertygrid   

public

override

bool canresetvalue(object component)   

public

override system.type componenttype   

}   

public

override

object getvalue(object component)   

public

override

bool isreadonly   

}   

public

override system.type propertytype   

}   

public

override

void resetvalue(object component)   

public

override

void setvalue(object component, object value)   

public

override

bool shouldserializevalue(object component)   

}   

}  這一段程式中,大部分都是返回預設值。需要注意的是下面的部分。

xprops 其實就是 xprop 的 collection。這很容易,只要用一行**,繼承 system.collections.generic.list(of xprop) 就搞定了。(希望你是了解 generic 類的,這玩意是 .net framework 2.0裡面的。)

另一方面,xprops 又需要實現 icustomtypedescriptor 的介面,這樣把這個類的物件和 propertygrid 關聯起來的時候,propertygrid 就會使用使用者自定義的部分來構成屬性視窗,而不是用這個類本身的程式property來構成屬性視窗。

using system.componentmodel;   

using system.collections.generic;   

using system.text;   

namespace customerpropertygrid   

public

string getclassname()   

public

string getcomponentname()   

public typeconverter getconverter()   

public eventdescriptor getdefaultevent()   

public propertydescriptor getdefaultproperty()   

public

object geteditor(system.type editorbasetype)   

public eventdescriptorcollection getevents(system.attribute attributes)   

public eventdescriptorcollection getevents()   

public propertydescriptorcollection getproperties(system.attribute attributes)   

return

new propertydescriptorcollection(props);   

}   

public propertydescriptorcollection getproperties()   

public

object getpropertyowner(propertydescriptor pd)   

#endregion

public

override

[" + i + "

] " + this[i].tostring() + system.environment.newline);   

}   

return sb.tostring();   

}   

}   

}  這段**雖然比較冗長,不過讀起來並不費力的。

icustomtypedescriptor 的實現部分中絕大部分是用 typedescriptor中 的成員實現的。只有 getproperties 是另外寫的,這個部分也很簡單,就是把 collection 裡面的內容構成乙個 propertydescriptor 集合,在用這個陣列構成 propertydescriptorcollection 返回。

需要指出的是,也可以用 dictionary 或者其他型別的 collection 來構成這個類,差別部分也就是getproperties 的寫法不同而已。

剩下的部分就是對 tostring 的 overrides 了,是為了方便後面對整個類的內容顯示。這段程式裡面使用了 stringbuilder,是屬於 system.text 的。在進行很多字串組合的時候,這比用運算子 (&) 速度快很多。

url:

PropertyGrid空間開發總結五

屬性值的校對 屬性值的校對主要包擴三個方面。首先,需要保證使用者輸入的值型別正確。其次,也是比較常用的,判斷輸入值後是否超出規定的範圍。最後,在一些情況下,要求資料具有指定的格式,例如小數點後精確到幾位的浮點數等。第乙個問題,值的型別在使用者輸入的時候,控制項本身就提供了很好的型別判斷,所以,一般情...

PropertyGrid中的屬性讀取

public class basesettings settingfilename is a file whose extension is xml private string settingfilename else xml name public basesettings string set...

PropertyGrid 用法 下拉框篇

如果有在propertygrid中用下拉框的朋友有困難的,請參見下面。並希望高手提出意見,說明 下面的 是不能run的。這是直接copy了我的東西,想用的朋友,需要修一些地方.using system using system.text using system.reflection using s...