亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在運行時隱藏 PropertyGrid 中的一些屬性

在運行時隱藏 PropertyGrid 中的一些屬性

C#
喵喔喔 2021-11-07 20:34:05
我正在做一個項目,允許用戶自定義Control. 我有一個具有類似的控制形式Label,TextBox,Button和PropertyGrid控制。當在用戶點擊Label我顯示的屬性Label在ProeprtyGrid其為使用以下代碼中的所有工作罰款:propertyGrid1.SelectedObject = SelectedControl;但我只想顯示一些屬性,如BackColor, Font, ForeColor, Text。是否可以隱藏屬性,因為我不希望用戶更改它或向他們顯示?如果是,如何?
查看完整描述

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。這是公共財產。


查看完整回答
反對 回復 2021-11-07
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

更新

請注意,這僅對隱藏屬性有用(如果可以)。Reza Aghaei 的答案實際上是正確的答案。


我將把它留在這里,因為它適用于另一種情況,當您只想在可以訪問屬性時隱藏它。


原來的


最簡單的方法可能是使用


[Browsable(false)]

可瀏覽屬性類


指定是否應在“屬性”窗口中顯示屬性或事件。


[Browsable(false)]

public int SecretSquirrels

{

  get; set;

}

也正如Marc Gravell所指出的,還有


PropertyGrid.BrowsableAttributes 屬性


獲取或設置與屬性網格附加到的對象關聯的可瀏覽屬性。


查看完整回答
反對 回復 2021-11-07
  • 2 回答
  • 0 關注
  • 589 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號