Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / Building Controls / October 2006

Tip: Looking for answers? Try searching our database.

Custom CustomValidator: Properties Window Problems

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
philaphan80@yahoo.com - 02 Oct 2006 03:05 GMT
Hello.  I'm still rather new to building custom controls, so please be
gentle.  ;)

What I'd like to be able to do, when validating, is drop my
CustomServerValidator (see below) and a generic Label control onto the
page.  Then, all I'd have to do is set two properties:
ControlToValidate and my custom ErrorLabel.  The custom control would
handle the rest at runtime, including sending the appropriate error
message to the Label tied to ErrorLabel.

I'd like the ErrorLabel property to act similarly to the
ControlToValidate property.  When I choose ErrorLabel in the Properties
window, I'd like to see a dropdown filled with a list of objects -- in
this case, of type Label -- currently available on the form.

This is where the error occurs.  The dropdown works properly, but if I
choose one of the labels, I get the following error message in Design
mode:

------------------------------------------------------------------------------------------------------------------------
Error Rendering Control - CustomServerValidator1
An unhandled exception has occurred.
Cannot create an object of type 'System.Web.UI.WebControls.Label' from
its string representation 'Label1' for the 'ErrorLabel' property.
------------------------------------------------------------------------------------------------------------------------

If I change the ErrorLabel property to type String, the error
disappears, but then I have to enter the Label's name manually.

How would I go about fixing this?

Also, one follow-up question.........

Because the CustomValidator derives from type Label, all of my
CustomServerValidators show up in the Properties dropdown list as well.
Once the issue above is fixed, is there any way to further "filter"
the dropdown to show only *pure* Label controls?

Thanks in advance!

Public Class CustomServerValidator
   Inherits System.Web.UI.WebControls.CustomValidator

   Private _ErrorLabel As Label

   <Browsable(True)> _
   Public Property ErrorLabel() As Label
       Get
           Return _ErrorLabel
       End Get
       Set(ByVal value As Label)
           _ErrorLabel = value
       End Set
   End Property

   Public Sub New()

       Me.EnableClientScript = False
       Me.ValidateEmptyText = True

   End Sub

   <...unrelated code removed...>

End Class
Gaurav Vaish (www.EdujiniOnline.com) - 02 Oct 2006 11:37 GMT
> This is where the error occurs.  The dropdown works properly, but if I
> choose one of the labels, I get the following error message in Design
[quoted text clipped - 6 lines]
> its string representation 'Label1' for the 'ErrorLabel' property.
> ------------------------------------------------------------------------------------------------------------------------

Let the property be of type 'String' because in the aspx, it has to be added
declaratively, something like:

<my:CustomServerValidator id='...' ControlToValidate='idOfControlToValidate'
... />

Add the following attribute to the property:

TypeConverter(typeof(System.Web.UI.WebControls.ValidatedControlConverter))

Signature

Happy Hacking,
Gaurav Vaish | www.mastergaurav.com
www.edujinionline.com
http://articles.edujinionline.com/webservices
-----------------------------------------

philaphan80@yahoo.com - 02 Oct 2006 17:24 GMT
Thanks for your quick response, Gaurav!  I appreciate the help.

I wasn't able to use your line of code exactly as you supplied it,
becuase ValidatedControlConverter returns a list of controls on the
page which can be validated.  (I needed a list of controls on the page
matching type Label.)  However, it pointed me in the right direction.

After poking around Google Groups and the Help file a bit more, I found
what I was looking for -- CustomIDConverter.

I created a new class which inherits CustomIDConverter and overrides
the Filter method.  It basically filters out any of the controls ready
to be listed if they don't match the specified type.  At Design time,
the dropdown in the Properties window now shows only the labels on the
form.  It also excludes my CustomServerValidator, because it's not a
*true* Label.

My revised code is below for anyone who might run into a similar
situation.

Public Class LabelConverter
   Inherits ControlIDConverter

   Protected Overrides Function FilterControl(ByVal control As
System.Web.UI.Control) As Boolean

       If Not TypeOf (control) Is Label Then
           Return False
       End If

       Return MyBase.FilterControl(control)

   End Function

End Class

Public Class CustomServerValidator
   Inherits System.Web.UI.WebControls.CustomValidator

   Private _ErrorLabel As String

   <Browsable(True), TypeConverter(GetType(LabelConverter))> _
   Public Property ErrorLabel() As String
       Get
           Return _ErrorLabel
       End Get
       Set(ByVal value As String)
           _ErrorLabel = value
       End Set
   End Property

   Public Sub New()

       Me.EnableClientScript = False
       Me.ValidateEmptyText = True

   End Sub

   <...unrelated code removed...>

End Class
Gaurav Vaish (www.EdujiniOnline.com) - 03 Oct 2006 14:30 GMT
> I wasn't able to use your line of code exactly as you supplied it,
> becuase ValidatedControlConverter returns a list of controls on the
> page which can be validated.  (I needed a list of controls on the page
> matching type Label.)  However, it pointed me in the right direction.

Yes... it will list down all controls that have an attribute
"ValidationProperty" (System.Web.UI.ValidationPropertyAttribute)

> After poking around Google Groups and the Help file a bit more, I found
> what I was looking for -- CustomIDConverter.

Yes... that's the root of all Control-To-Validate filters.

>    Protected Overrides Function FilterControl(ByVal control As
> System.Web.UI.Control) As Boolean
[quoted text clipped - 6 lines]
>
>    End Function

How about something like this:

If TypeOf(control) is Label OR TypeOf(control) is CustomServerValidator Then
   Return True
Else
   Return False
End If

Don't call MyBase.FilterControl(control)
   because that will always return "true".

Signature

Happy Hacking,
Gaurav Vaish | www.mastergaurav.com
www.edujinionline.com
http://articles.edujinionline.com/webservices
-----------------------------------------

philaphan80@yahoo.com - 04 Oct 2006 21:25 GMT
> How about something like this:
>
[quoted text clipped - 3 lines]
>     Return False
> End If

No, that wouldn't work, because it would display my own control in the
dropdown list.  The way I listed it above works well, because it
excludes anything that's not a Label.

Thanks again for your help, Gaurav.  You saved me from a lot of time
and frustration.
Gaurav Vaish (www.EdujiniOnline.com) - 05 Oct 2006 03:42 GMT
> No, that wouldn't work, because it would display my own control in the
> dropdown list.  The way I listed it above works well, because it
> excludes anything that's not a Label.

Hmm... chicken and egg problem in that case...

> Thanks again for your help, Gaurav.  You saved me from a lot of time
> and frustration.

Always welcome!

Signature

Happy Hacking,
Gaurav Vaish | www.mastergaurav.com
www.edujinionline.com
http://articles.edujinionline.com/webservices
-----------------------------------------

philaphan80@yahoo.com - 20 Oct 2006 19:41 GMT
> Hmm... chicken and egg problem in that case...

You're right, Gaurav.

When I was testing this previously, I only had one
CustomServerValidator on the page.  Once I dropped a second one onto
the page, it was available to the first one as a possible ErrorLabel
control.  The first was available to the second as well.

It seems by default, the control filters itself from the list even when
overridden.  But the other ones are fair game.  (That's why I never saw
my control in the dropdown list!  It was automatically filtering
itself.)

Anyway, I've modified the code and figured it was worth posting here in
case anyone else runs into a similar problem.

       If TypeOf (control) Is BaseValidator Then
           Return False
       ElseIf Not TypeOf (control) Is Label Then
           Return False
       Else
           Return True
       End If

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.