2 回答

TA貢獻1865條經驗 獲得超7個贊
我相信您正在尋找自定義類型描述符。
雖然另一個答案是共享有關Browsableattribute 和BrowsableAttributesof 的正確信息PropertyGrid,但我想說這不是該問題的正確實用解決方案。
Browsable為現有控件類(如Label、等)設置屬性或任何其他自定義屬性是不切實際的Button。因為通過這種方式,op 需要覆蓋這些類的所有屬性并用合適的屬性裝飾它們。甚至最糟糕的是,并非所有的財產都是可覆蓋的。
實際的解決方案是什么?
正如我之前提到的,我相信您正在尋找自定義類型描述符。您可以提供有關分配新對象TypeDescriptor或實現ICustomTypeDescriptor或派生自的對象的元數據CustomTypeDescriptor。
例子
例如,我在這里創建了一個CustomObjectWrapper派生類,該類CustomTypeDescriptor在構造函數中接受一個對象。通過這種方式,我可以簡單地通過覆蓋GetProperties.
然后,我沒有將其分配button1給PropertyGrid,而是將其包裹起來CustomObjectWrapper并分配CustomObjectWrapper給屬性網格。這樣它只顯示過濾后的屬性,而這些屬性實際上來自button1.
這是植入:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
public class CustomObjectWrapper : CustomTypeDescriptor
{
public object WrappedObject { get; private set; }
public List<string> BrowsableProperties { get; private set; }
public CustomObjectWrapper(object o)
:base(TypeDescriptor.GetProvider(o).GetTypeDescriptor(o))
{
WrappedObject = o;
BrowsableProperties = new List<string>() { "Text", "BackColor" };
}
public override PropertyDescriptorCollection GetProperties()
{
return this.GetProperties(new Attribute[] { });
}
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>()
.Where(p=>BrowsableProperties.Contains(p.Name))
.Select(p => TypeDescriptor.CreateProperty(
WrappedObject.GetType(),
p,
p.Attributes.Cast<Attribute>().ToArray()))
.ToArray();
return new PropertyDescriptorCollection(properties);
}
}
并作為用法:
propertyGrid1.SelectedObject = new CustomObjectWrapper(button1);
您可以簡單地添加新的屬性名BrowsableProperties的CustomObjectWrapper。這是公共財產。

TA貢獻1900條經驗 獲得超5個贊
更新
請注意,這僅對隱藏屬性有用(如果可以)。Reza Aghaei 的答案實際上是正確的答案。
我將把它留在這里,因為它適用于另一種情況,當您只想在可以訪問屬性時隱藏它。
原來的
最簡單的方法可能是使用
[Browsable(false)]
可瀏覽屬性類
指定是否應在“屬性”窗口中顯示屬性或事件。
[Browsable(false)]
public int SecretSquirrels
{
get; set;
}
也正如Marc Gravell所指出的,還有
PropertyGrid.BrowsableAttributes 屬性
獲取或設置與屬性網格附加到的對象關聯的可瀏覽屬性。
- 2 回答
- 0 關注
- 589 瀏覽
添加回答
舉報