2011-08-14 25 views

答えて

9

使用するための明確なのですホープ、この属性を参照するときに、ユーザーが混乱し、次のようになります。継承のために

[Browsable(false)] 
public bool AProperty {...} 

をプロパティ:

[Browsable(false)] 
public override bool AProperty {...} 

もう一つのアイデア(あなたはすべての基本クラスのメンバを非表示にしようとしているので)

してから、プロパティグリッドのために:

MyCtrl tx = new MyCtrl(); 
    pg1.SelectedObject = tx.ExtraProperties; 

下側には、使用、それはMyCtrlプロパティを非表示にするには

tx.PropertyA = "foo"; 

から

tx.ExtraProperties.PropertyA = "foo"; 
+0

は、私は、基本クラスのプロパティを非表示にします。その場合:TextBoxの小道具。ベースクラスの小道具を隠すには?それが問題です。 –

+0

はい、うまくいきます。あなたは私の質問に「どのようなテクニックが当てはまるのでしょうか?隠れていますか?基本クラスの各小道具?」...私はおそらく属性をフィルタリングすることができますか?すべての属性がコンパイルされたアセンブリに対して静的であるため可能です。 –

+0

ラース、私の返信をお読みください。それはまさに私が必要としていたものでした... –

6

にこれらのプロパティのアクセスレベルを変更していますプロパティの[Browsable(False)]属性。 を非表示にする

[Browsable(false)] 
public bool AProperty { get; set;} 

proeprtiesを継承し、あなたはベースをオーバーライドして、閲覧可能な属性を適用する必要があります。

[Browsable(false)] 
public override string InheritedProperty { get; set;} 

注:あなたは状況に応じてvirtualまたはnewキーワードを追加する必要があります。

より良いアプローチは、ControlDesignerを使用することです。デザイナーにはPreFilterPropertiesというオーバーライドがあり、これはPropertyGridによって抽出されたコレクションに余分な属性を追加するために使用できます。

Designer(typeof(MyControlDesigner))] 
public class MyControl : TextBox 
{ 
    // ... 
} 

public class MyControlDesigner : ... 
{ 
    // ... 

    protected override void PreFilterProperties(
          IDictionary properties) 
    { 
     base.PreFilterProperties (properties); 

     // add the names of proeprties you wish to hide 
     string[] propertiesToHide = 
        {"MyProperty", "ErrorMessage"}; 

     foreach(string propname in propertiesToHide) 
     { 
      prop = 
       (PropertyDescriptor)properties[propname]; 
      if(prop!=null) 
      { 
       AttributeCollection runtimeAttributes = 
              prop.Attributes; 
       // make a copy of the original attributes 

       // but make room for one extra attribute 

       Attribute[] attrs = 
        new Attribute[runtimeAttributes.Count + 1]; 
       runtimeAttributes.CopyTo(attrs, 0); 
       attrs[runtimeAttributes.Count] = 
           new BrowsableAttribute(false); 
       prop = 
       TypeDescriptor.CreateProperty(this.GetType(), 
          propname, prop.PropertyType,attrs); 
       properties[propname] = prop; 
      }    
     } 
    } 
} 

あなたがきれいに分離することを可能にするpropertiesToHideに非表示にしたいproeprtiesの名前を追加することができます。原因

クレジット:それは継承されたクラスについてではありませんhttp://www.codeproject.com/KB/webforms/HidingProperties.aspx#

+0

そうです。ありがとう。 意味( "<{0}:MyControl runat ="サーバー ">")? ASPからのものですか?私はWinFormsを使用しています... –

+0

はい。 Winformsの部分は無視できます。私は私の答えを更新します。 – Mrchief

+0

私は試しましたが、助けになりませんでした。ランタイム中に機能しますか? –

関連する問題