|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Hiding a PropertyI'm developing a control, and I need to hide some properties to the user. For example, suppose I need Text property to be completely inacessible (from a Form/Code that is into another project/assembly). I tried with attributes: <Browsable(False), _ EditorBrowsable(EditorBrowsableState.Never), _ RefreshProperties(RefreshProperties.Repaint), _ Description("Gets or sets the control's Text value.")> _ Public Shadows Property Text() As String Get Return MyBase.Text End Get Set(ByVal Value As String) If MyBase.Text <> Value Then MyBase.Text = Value End If End Set End Property but I discovered that Text property is invisible by the property browser, but it is still accessible through IntelliSense. Then, I tried associating a designer: Protected Overrides Sub PostFilterProperties(ByVal properties As IDictionary) properties.Remove("Text") MyBase.PostFilterProperties(properties) End Sub but, again, the Text property is accessible by IntelliSense. What's wrong? Thank you. Dom You might consider private property`s
you can also choose to declare only the get or set private regards Michel Posseth Show quoteHide quote "Dom" <dom.dominiqueREM***@gmail.com> schreef in bericht news:u3HEGcy0GHA.4228@TK2MSFTNGP06.phx.gbl... > Hi all > I'm developing a control, and I need to hide some properties to the user. > For example, suppose I need Text property to be completely inacessible > (from a Form/Code that is into another project/assembly). > > I tried with attributes: > > <Browsable(False), _ > EditorBrowsable(EditorBrowsableState.Never), _ > RefreshProperties(RefreshProperties.Repaint), _ > Description("Gets or sets the control's Text value.")> _ > Public Shadows Property Text() As String > Get > Return MyBase.Text > End Get > Set(ByVal Value As String) > If MyBase.Text <> Value Then > MyBase.Text = Value > End If > End Set > End Property > > but I discovered that Text property is invisible by the property browser, > but it is still accessible through IntelliSense. > Then, I tried associating a designer: > > Protected Overrides Sub PostFilterProperties(ByVal properties As > IDictionary) > properties.Remove("Text") > MyBase.PostFilterProperties(properties) > End Sub > > but, again, the Text property is accessible by IntelliSense. > > What's wrong? > > Thank you. > > Dom Michel Posseth [MCP] said the following On 08/09/2006 16.07:
> You might consider private property`s This does not seems to solve my problem: in case of an inherited property (such as Text) a private property declaration simply make IntelliSense show the parent property. > you can also choose to declare only the get or set private Sorry, I don't understand what you mean...Thank you for reply. Dom I have the same problem and have not found any solution to force Intell... to
not show it. What I do is shadow the property in my control then if the user tries to set it, just ignore it or force an error. However, I think the user can actually set the property in the base control thru reflection. -- Show quoteHide quoteDennis in Houston "Dom" wrote: > Michel Posseth [MCP] said the following On 08/09/2006 16.07: > > > You might consider private property`s > This does not seems to solve my problem: in case of an inherited > property (such as Text) a private property declaration simply make > IntelliSense show the parent property. > > > you can also choose to declare only the get or set private > Sorry, I don't understand what you mean... > > Thank you for reply. > Dom > > > Dennis said the following On 08/09/2006 17.56:
> I have the same problem and have not found any solution to force Intell... to With this approach the first problem is that an exception can be raised > not show it. What I do is shadow the property in my control then if the user > tries to set it, just ignore it or force an error. However, I think the user > can actually set the property in the base control thru reflection. at run-time only, not at design time, and the property remains accesible like others. What I need is make a property invisible, not just unusable. Today I tried to convert my project to VS2005, and I've seen that IntelliSense DOES NOT expose the property despite it remains usable. Maybe the problem is a bug of VS2003? Anybody have any solution for hiding an inherited property/member? Thanks! Dom
Show quote
Hide quote
"Dom" <dom.dominiqueREM***@gmail.com> wrote in message Because of the OOP principles, you cannot "hide" a property. If you inherit news:%235nBiE20GHA.4228@TK2MSFTNGP06.phx.gbl... > Dennis said the following On 08/09/2006 17.56: >> I have the same problem and have not found any solution to force >> Intell... to not show it. What I do is shadow the property in my control >> then if the user tries to set it, just ignore it or force an error. >> However, I think the user can actually set the property in the base >> control thru reflection. > > With this approach the first problem is that an exception can be raised at > run-time only, not at design time, and the property remains accesible like > others. > What I need is make a property invisible, not just unusable. > Today I tried to convert my project to VS2005, and I've seen that > IntelliSense DOES NOT expose the property despite it remains usable. Maybe > the problem is a bug of VS2003? > > > Anybody have any solution for hiding an inherited property/member? > > Thanks! > > Dom > > from an object that has a "Text" property, the derived class will contain a Text property. Even if you could hide the "Text" property, all the developer would have to do is cast the derived instance into the base class instance and access the Text property from there. There are alternatives to what you are trying to achieve though. One is encapsulating the base object completely within the derived class. Instead of inheriting the base class, you create an instance of the class and store the reference in a member variable inside the class you are creating. Any properties/methods you would like to expose of the private instance you would expose via properties/methods of your class. This can be a pain for large classes where you would like to expose large numbers of properties/methods, but it works most of the time. And lastly, the last alternative would be to inherit from the class, override the property you don't want the developers to use, and throw an NotImplementedException exception. This way, if the developer does access it, at runtime an exception that specifically states what the problem is, is thrown. This is actually really simple to do. If the developer casts to base class and accesses the property, the exception is still thrown. Oh, for shadowing methods. If you shadow a method and changes it's accessor to not be visible (private, friend) then when the classes property is called at runtime, the shadowed property/method is not called. Instead, the base classes property/method is ... I believe ... correct me if I'm wrong...but I believe that's the way it is. HTH, Mythran Can you override any properties or only certain ones. What about inherited
methods...how do you hide them? -- Show quoteHide quoteDennis in Houston "Mythran" wrote: > > "Dom" <dom.dominiqueREM***@gmail.com> wrote in message > news:%235nBiE20GHA.4228@TK2MSFTNGP06.phx.gbl... > > Dennis said the following On 08/09/2006 17.56: > >> I have the same problem and have not found any solution to force > >> Intell... to not show it. What I do is shadow the property in my control > >> then if the user tries to set it, just ignore it or force an error. > >> However, I think the user can actually set the property in the base > >> control thru reflection. > > > > With this approach the first problem is that an exception can be raised at > > run-time only, not at design time, and the property remains accesible like > > others. > > What I need is make a property invisible, not just unusable. > > Today I tried to convert my project to VS2005, and I've seen that > > IntelliSense DOES NOT expose the property despite it remains usable. Maybe > > the problem is a bug of VS2003? > > > > > > Anybody have any solution for hiding an inherited property/member? > > > > Thanks! > > > > Dom > > > > > > Because of the OOP principles, you cannot "hide" a property. If you inherit > from an object that has a "Text" property, the derived class will contain a > Text property. Even if you could hide the "Text" property, all the > developer would have to do is cast the derived instance into the base class > instance and access the Text property from there. > > There are alternatives to what you are trying to achieve though. One is > encapsulating the base object completely within the derived class. Instead > of inheriting the base class, you create an instance of the class and store > the reference in a member variable inside the class you are creating. Any > properties/methods you would like to expose of the private instance you > would expose via properties/methods of your class. This can be a pain for > large classes where you would like to expose large numbers of > properties/methods, but it works most of the time. And lastly, the last > alternative would be to inherit from the class, override the property you > don't want the developers to use, and throw an NotImplementedException > exception. This way, if the developer does access it, at runtime an > exception that specifically states what the problem is, is thrown. This is > actually really simple to do. If the developer casts to base class and > accesses the property, the exception is still thrown. > > Oh, for shadowing methods. If you shadow a method and changes it's accessor > to not be visible (private, friend) then when the classes property is called > at runtime, the shadowed property/method is not called. Instead, the base > classes property/method is ... I believe ... correct me if I'm wrong...but I > believe that's the way it is. > > HTH, > Mythran > > > Hello Mythran,
> Because of the OOP principles, you cannot "hide" a property. If this is true, and I cannot doubt is it, what is the pourpose of PreFilterProperties and PostFilterProperties? And, again, what it the pourpose of the statement EditorBrowsable(EditorBrowsableState.Never)?? I understand that hiding a property/method does actually not hides the same base property/method, but I think is not difficult a case (like mine) where some properties are really useless. In my case, I have lot of controls derived from Windows.System.Windows.Forms.Control, but not all controls make use of Text property. Also I have a lot of controls derived from ContainerControl, but my controls are not designed to be scrollable, and this is why I need to hide "AutoScroll" property. > There are alternatives to what you are trying to achieve though. One is You are right. This is an approach I actually use for some of my custom > encapsulating the base object completely within the derived class. Instead > of inheriting the base class, you create an instance of the class and store > the reference in a member variable inside the class you are creating. classes. But I cannot use this method when i derive from a class like Windows.System.Windows.Forms.Control. > And lastly, the last This is a very good approach. But, however, the property/method is still > alternative would be to inherit from the class, override the property you > don't want the developers to use, and throw an NotImplementedException > exception. exposed by IntelliSense. BTW: I just discovered that using EditorBrowsable(EditorBrowsableState.Never) make a property is STILL visible in VS2003, but correctly NOT visible with VS2005 (same project). > Oh, for shadowing methods. If you shadow a method and changes it's accessor You are absolutely right: the parent propery/method is colled instead.> to not be visible (private, friend) then when the classes property is called > at runtime, the shadowed property/method is not called. Instead, the base > classes property/method is ... I believe ... correct me if I'm wrong...but I > believe that's the way it is. Thank you for your comments! I should greately appreciate your comment about PostFilterProperties method and EditorBrowsable attribute. Thanks! Dom
Show quote
Hide quote
"Dom" <dom.dominiqueREM***@gmail.com> wrote in message From what I read in MSDN, the PostFilterProperties just allows you to filter news:%23ockp3D1GHA.4748@TK2MSFTNGP04.phx.gbl... > Hello Mythran, > >> Because of the OOP principles, you cannot "hide" a property. > If this is true, and I cannot doubt is it, what is the pourpose of > PreFilterProperties and PostFilterProperties? > > And, again, what it the pourpose of the statement > EditorBrowsable(EditorBrowsableState.Never)?? > > I understand that hiding a property/method does actually not hides the > same base property/method, but I think is not difficult a case (like mine) > where some properties are really useless. > In my case, I have lot of controls derived from > Windows.System.Windows.Forms.Control, but not all controls make use of > Text property. Also I have a lot of controls derived from > ContainerControl, but my controls are not designed to be scrollable, and > this is why I need to hide "AutoScroll" property. > > >> There are alternatives to what you are trying to achieve though. One is >> encapsulating the base object completely within the derived class. >> Instead of inheriting the base class, you create an instance of the class >> and store the reference in a member variable inside the class you are >> creating. > You are right. This is an approach I actually use for some of my custom > classes. But I cannot use this method when i derive from a class like > Windows.System.Windows.Forms.Control. > > >> And lastly, the last alternative would be to inherit from the class, >> override the property you don't want the developers to use, and throw an >> NotImplementedException exception. > This is a very good approach. But, however, the property/method is still > exposed by IntelliSense. > > BTW: I just discovered that using > EditorBrowsable(EditorBrowsableState.Never) > make a property is STILL visible in VS2003, but correctly NOT visible with > VS2005 (same project). > >> Oh, for shadowing methods. If you shadow a method and changes it's >> accessor to not be visible (private, friend) then when the classes >> property is called at runtime, the shadowed property/method is not >> called. Instead, the base classes property/method is ... I believe ... >> correct me if I'm wrong...but I believe that's the way it is. > You are absolutely right: the parent propery/method is colled instead. > > > Thank you for your comments! > > I should greately appreciate your comment about PostFilterProperties > method and EditorBrowsable attribute. > > > Thanks! > > Dom (add/remove) properties visible from the TypeDescriptor. Doesn't actually change the properties of the object.... Mythran Well maybe i understood you wrong
i understood that you have a property that you do not want to be accessible outside your assembly . well you can do this through the scope qualifiers in VS.net 2005 you can even mix the get and set qualifiers ( Private , Friend , Public differ for get and set ) Now i understand that you want your property to be fully functional to the outside world however you do not want to show that it is actually there . well i do not believe this confirms to OOP ,,, if i may ask why do you want this behavior ? regards Michel Show quoteHide quote "Dom" wrote: > Michel Posseth [MCP] said the following On 08/09/2006 16.07: > > > You might consider private property`s > This does not seems to solve my problem: in case of an inherited > property (such as Text) a private property declaration simply make > IntelliSense show the parent property. > > > you can also choose to declare only the get or set private > Sorry, I don't understand what you mean... > > Thank you for reply. > Dom > > > Hi Michel
M. Posseth said the following On 09/09/2006 13.14: > well you can do this through the scope qualifiers in VS.net 2005 you can This feature is not availabe to VS2003. This is why your suggestions was > even mix the get and set qualifiers ( Private , Friend , Public differ for > get and set ) incomprehensible for me! > well i do not believe this confirms to OOP ,,, if i may ask why do you want Currently, I have a lot of controls derived from > this behavior ? Windows.System.Windows.Forms.Control. As you can easily fugure, not all controls make use of Text property, for example. In other controls, I make a 'private' use of Text property. This is why I need hide some properties. Thank you for your help. Dom Aha ,,, i understand now :-)
well this might help you can apply a controldesigner to your usercontrol... http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsdesigncontroldesignerclasstopic.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcomponentmodeldesignidesignerfilterclasstopic.asp I have never used it myself but this seems to do what you want regards Michel Show quoteHide quote "Dom" <dom.dominiqueREM***@gmail.com> schreef in bericht news:%23Rvnq3D1GHA.328@TK2MSFTNGP06.phx.gbl... > Hi Michel > > M. Posseth said the following On 09/09/2006 13.14: >> well you can do this through the scope qualifiers in VS.net 2005 you can >> even mix the get and set qualifiers ( Private , Friend , Public differ >> for get and set ) > This feature is not availabe to VS2003. This is why your suggestions was > incomprehensible for me! > >> well i do not believe this confirms to OOP ,,, if i may ask why do you >> want this behavior ? > Currently, I have a lot of controls derived from > Windows.System.Windows.Forms.Control. > As you can easily fugure, not all controls make use of Text property, for > example. In other controls, I make a 'private' use of Text property. This > is why I need hide some properties. > > Thank you for your help. > Dom Hi Michel
as I reported in my first post, I already implemented a Control Designer, but it did not worked. Thank you for the hint, I'll try again :-) Dom Michel Posseth [MCP] said the following On 10/09/2006 12.34: Show quoteHide quote > Aha ,,, i understand now :-) > > well this might help > > you can apply a controldesigner to your usercontrol... > > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsdesigncontroldesignerclasstopic.asp > > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcomponentmodeldesignidesignerfilterclasstopic.asp > > I have never used it myself but this seems to do what you want > > regards > > Michel > > > > > > "Dom" <dom.dominiqueREM***@gmail.com> schreef in bericht > news:%23Rvnq3D1GHA.328@TK2MSFTNGP06.phx.gbl... >> Hi Michel >> >> M. Posseth said the following On 09/09/2006 13.14: >>> well you can do this through the scope qualifiers in VS.net 2005 you can >>> even mix the get and set qualifiers ( Private , Friend , Public differ >>> for get and set ) >> This feature is not availabe to VS2003. This is why your suggestions was >> incomprehensible for me! >> >>> well i do not believe this confirms to OOP ,,, if i may ask why do you >>> want this behavior ? >> Currently, I have a lot of controls derived from >> Windows.System.Windows.Forms.Control. >> As you can easily fugure, not all controls make use of Text property, for >> example. In other controls, I make a 'private' use of Text property. This >> is why I need hide some properties. >> >> Thank you for your help. >> Dom > > Dom,
In my opinion you cannot. The same is with the background from the picturebox. It is there but does nothing, Herfried does not agreed this with me, he can be right, but I never saw a working sample from him about this. Cor Show quoteHide quote "Dom" <dom.dominiqueREM***@gmail.com> schreef in bericht news:u3HEGcy0GHA.4228@TK2MSFTNGP06.phx.gbl... > Hi all > I'm developing a control, and I need to hide some properties to the user. > For example, suppose I need Text property to be completely inacessible > (from a Form/Code that is into another project/assembly). > > I tried with attributes: > > <Browsable(False), _ > EditorBrowsable(EditorBrowsableState.Never), _ > RefreshProperties(RefreshProperties.Repaint), _ > Description("Gets or sets the control's Text value.")> _ > Public Shadows Property Text() As String > Get > Return MyBase.Text > End Get > Set(ByVal Value As String) > If MyBase.Text <> Value Then > MyBase.Text = Value > End If > End Set > End Property > > but I discovered that Text property is invisible by the property browser, > but it is still accessible through IntelliSense. > Then, I tried associating a designer: > > Protected Overrides Sub PostFilterProperties(ByVal properties As > IDictionary) > properties.Remove("Text") > MyBase.PostFilterProperties(properties) > End Sub > > but, again, the Text property is accessible by IntelliSense. > > What's wrong? > > Thank you. > > Dom Hi Cor
Cor Ligthert [MVP] said the following On 09/09/2006 14.51: > Dom, This is a core statement! "It is there but does nothing". This can be > In my opinion you cannot. The same is with the background from the > picturebox. It is there but does nothing, good, but it exclude a 'private' use of a property. Furthermore, for a user is not acceptable that you offer a property that "does nothing". Thank you! Dom
LAN IP
Visual Basic beginner question Search for files in folders? Date/Time Pickers/VB2005 self-extracting files in .net AxSHDocVw.AxWebBrowser events VB2005: Error Using a Separate Search Form How can I execute a simple command? String quickie: Remove trailing space from each RichTextBox line? how to open a form in C# |
|||||||||||||||||||||||