有沒有辦法使「Browsable」屬性有條件,所以應用它的屬性有時會出現在屬性頁面中,有時不會?
謝謝:)有條件的「可瀏覽的」屬性
回答
有沒有簡單的方法。
你可以通過實現ICustomTypeDescriptor來解決這個問題。這裏有一篇關於implementing ICustomTypeDescriptor的好文章。
或者您可以將您自己的ControlDesigner與您的課程關聯,並覆蓋PreFilterProperties方法以添加或刪除在屬性網格中查看的屬性。
您可以通過提供自定義類型模型來實現此目的;在最簡單的級別,你可以爲你的類型提供一個自定義的TypeDescriptor
,從ExpandableObjectConverter
衍生而來,只需簡單地包含/排除給定的屬性 - 但這隻適用於屬性頁面使用的PropertyGrid
。一個更復雜的方法是使用ICustomTypeDescriptor
/TypeDescriptionProvider
- 這可以然後內部工作,如DataGridView
我碰到這在尋找一種方式來聲明某些成員可見或隱藏在智能感知,並能夠一次所有需要在編譯時被隱藏改變它來了。我不知道你是否在尋找,但我找到了我的問題的答案......認爲它不會傷害分享。
我設置條件編譯符號(項目屬性的生成選項卡中找到)IS_VIS(如果你想某些成員顯示,如果你想隱藏他們是假值爲真),然後:
#if IS_VIS
public const System.ComponentModel.EditorBrowsableState isVis =
ComponentModel.EditorBrowsableState.Always;
#else
public const System.ComponentModel.EditorBrowsableState isVis =
ComponentModel.EditorBrowsableState.Never;
#endif
你再引用isVis變量屬性:
[EditorBrowsable(isVis)]
public string myMethod...
我這樣做在VB中,這被匆匆轉化爲C#。如果有什麼不對,請告訴我。
我不確定這是否適用於您的情況,但您可以通過調用以下函數在運行時調整「Browsable」裝飾。
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable)
{
// Get the Descriptor's Properties
PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];
// Get the Descriptor's "Browsable" Attribute
BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
// Set the Descriptor's "Browsable" Attribute
isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
嗨。我正在尋找這樣的東西。當我使用你的代碼時,我在第一行'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];`中得到一個nullValue異常。我想知道在哪裏可以把這個功能和它如何反映在房產網(沒看到在功能的PropertyGrid的對象)。 – 2017-03-15 06:32:33
上@ neoikon的回答以上,避免了Ganesh在評論中提到的例外,這裏的改進是使用泛型要獲得類型的一個版本:
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void SetBrowsableProperty<T>(string strPropertyName, bool bIsBrowsable)
{
// Get the Descriptor's Properties
PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(typeof(T))[strPropertyName];
// Get the Descriptor's "Browsable" Attribute
BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
// Set the Descriptor's "Browsable" Attribute
isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
然後,您可以還添加一個版本,需要一個實例:
/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="obj">An instance of the object whose property should be modified.</param>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void SetBrowsableProperty<T>(T obj, string strPropertyName, bool bIsBrowsable)
{
SetBrowsableProperty<T>(strPropertyName, bIsBrowsable);
}
用法:
class Foo
{
[Browsable(false)]
public string Bar { get; set; }
}
void Example()
{
SetBrowsableProperty<Foo>("Bar", true);
Foo foo = new Foo();
SetBrowsableProperty(foo, "Bar", false);
}
- 1. 可瀏覽的屬性和Infragistics WinGrid
- 2. Nightmare.js有條件瀏覽
- 3. 有條件的CSS的IE瀏覽器
- 4. 有條件的屬性
- 5. 有條件的HTML屬性
- 6. PHP瀏覽器有條件的
- 7. CSS屬性條件時,根據瀏覽器
- 8. 可以瀏覽多個頁面的屬性的自定義屬性(JQuery&HTML)
- 9. ASP.NET AJAX預覽6條件屬性
- 10. IE瀏覽器的CSS旋轉屬性
- 11. 安卓瀏覽器中的Flexbox屬性
- 12. Maple瀏覽器中的css3屬性
- 13. 有沒有一種方法可以讓Chrome瀏覽器的title =屬性工作?
- 14. 有條件checked屬性
- 15. 有沒有工具來瀏覽目標和屬性的定義?
- 16. C#創建自定義控件的文件屬性瀏覽
- 17. Neo4j的2.0.1瀏覽器 - 顯示節點屬性(除ID屬性)
- 18. 基於屬性的條件屬性
- 19. C#在設計器中顯示可瀏覽的子屬性
- 20. 瀏覽器可以理解未引用的屬性值嗎?
- 21. DocumentText屬性沒有DocumentComplete事件在web瀏覽器
- 22. 有條件檢查項目的屬性
- 23. 覆蓋的實例屬性有條件
- 24. 有條件的隱藏輸入屬性
- 25. Rails - 有條件的html屬性
- 26. MVC 3有條件所需的屬性
- 27. 有條件的驗證檢查屬性
- 28. 有條件的序列化屬性
- 29. 有條件的屬性設置
- 30. 有條件的屬性 - Asp.Net MVC視圖
實現ICustomTypeDescriptor的鏈接指向https://msdn.microsoft.com/magazine/msdn-magazine-issues我認爲他們已經刪除了原始頁面 – gg89 2016-12-05 04:59:40