Readonly Checkbox?

J

John Kievlan

Well, I'm sure you guys know that the ASP.NET Checkbox
control doesn't have a Readonly property. I'm writing an
application where I need it to have, that is, I want to
be able to set the Checked property in code, but if the
user clicks on it, the checkbox won't change.

Now, I'll admit I truly don't know how to do this. I can
easily write a control where I can't set the Checked
property in code, as follows:

'--------- Begin Code --------------
<DefaultProperty("Checked"), ToolboxData("<{0}:CB
runat=server></{0}:CB>")> Public Class CB
Inherits System.Web.UI.WebControls.CheckBox

Dim _readonly As Boolean

<Bindable(True), Category("Appearance"), DefaultValue
(False)> Overrides Property [Checked]() As Boolean
Get
Return MyBase.Checked
End Get

Set(ByVal Value As Boolean)
If Not _readonly Then
MyBase.Checked = Value
End If
End Set
End Property

<Bindable(True), Category("Appearance"), DefaultValue
(False)> Property [Readonly]() As Boolean
Get
Return _readonly
End Get

Set(ByVal Value As Boolean)
_readonly = Value
End Set
End Property
End Class
'--------- End Code --------------

With that control, I can't set the Checked property in
code, but if I view a form with that control in my
browser and click on the checkbox, it checks or unchecks
as usual, which is exactly the opposite of the behavior
I'd like it to have.

Now I can't figure out how to get that functionality, or
indeed how to handle the event of the user clicking on
the control at all without posting the form back to the
server. I played with overriding the various Render
methods, but that got me nowhere.

The basic problem is that I have no clue how the control
is drawn as checked or unchecked when the user clicks it
on his/her browser. Apparently there's no postback (as I
would assume in any case), so there must be some code
that runs on the client side to handle it. Can I alter
that code? How do I get to it? Keep in mind that I want
this to be a server control, not a client control. I
really don't even need to mess with the Checked property
of the control -- if I could just prevent it from drawing
the checked/unchecked state when it's clicked, I will
have accomplished what I want, since my goal is to have a
control in which I can display boolean data without the
user having the ability to alter the visual state of the
control.

Anyone have any ideas? Thanks in advance.
 
S

Shawn B.

Either set Enabled=False (it'll be dim) or... in the render...

Attributes.Add("onClick", "this.checked=" + lcase(checked.tostring) + ";")

So that if it's enabled or disabled and you don't want it dim, it'll alsways
be the value that it started with.


That should do,
Thanks,
Shawn
 
J

John Kievlan

-----Original Message-----
Either set Enabled=False (it'll be dim) or... in the
render...

Yes, I know about that, that's what I've been doing, but
I don't like having it grayed out... it doesn't look
quite so neat... and organized... as I'd like it to :p
Attributes.Add("onClick", "this.checked=" + lcase (checked.tostring) + ";")

So that if it's enabled or disabled and you don't want it dim, it'll alsways
be the value that it started with.

Thanks, friend! That did it! It works perfectly. My
code is now as follows:

Protected Overrides Sub Render(ByVal writer As
System.Web.UI.HtmlTextWriter)
If _readonly Then
MyBase.Attributes.Add
("onClick", "javascript:" & Me.ID & ".checked=" + LCase
(Checked.ToString) + ";")
End If
MyBase.Render(writer)
End Sub

That adds a SPAN element around the checkbox that
contains the onClick event. I added the "javascript:"
because I use javascript and vbscript both on this
particular form, and the default page language is
vbscript. "this.checked" doesn't work since it thinks
you're talking about the SPAN element, so I changed it to
use the ID of the control -- and it works great. A
readonly control can only be changed from code, a non-
readonly control can be changed both in code and by being
clicked.

Again, thanks.

--John
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top