Click here to Skip to main content
Licence 
First Posted 24 Feb 2004
Views 49,382
Bookmarked 40 times

Enable ReadOnly Mode for your WebForms!

By | 24 Feb 2004 | Article
This article will show you, how to implement a readonly mode for webforms.

Introduction

A common webform should be able to display the content in:

  • Edit mode (to change data)

    Edit Mode

  • Read only mode (to display data)

    Read Mode

Let's say, you have to program a webform with several controls (textboxes, dropdowns, checkboxes....) to add, edit and display detail information (e. g. customers details).

Wouldn't it be nice, if you could just switch between edit mode (with all different input controls) and display mode (labels instead of the input controls) by calling a method?

Code

To implement this behavior, I wrote a method in a base class (derived from System.Web.UI.Page), which is accessible from any webform deriving from this base class.

First of all, I collect all (self defined) input-controls in a DataTable (the DataTable has three columns: the ControlCollection [in which the controls reside], the control and index of the control):

/// Check all controls inside Collection and put them into a ControlContainer
/// <PARAM name="cc">ControlCollection</PARAM>
private void CollectControls(ControlCollection cc) {

    foreach(Control c in cc) {

        //Which Controls do we support?
        if (c is TextBox || 
            c is ListBox || 
            c is DropDownList || 
            c is RadioButton ||
            c is RadioButtonList ||
            c is CheckBox ||
            c is CheckBoxList ||
            c is BaseValidator ||
            c is Button)
            _ControlContainer.Rows.Add(new object[]{cc, c, cc.IndexOf(c)});

        //Are there further Controls inside current Control?
        if (c.HasControls())
            CollectControls(c.Controls);
    }
}

Second, I replace the input-controls with Labels...

/// Replace writable controls with read-only controls
private void ReplaceControls() {

    //Change sort-order, because removing should start from the highest index
    DataRow[] drs = _ControlContainer.Select("", "Index desc");

    foreach(DataRow dr in drs) {

        ControlCollection cc = (ControlCollection)dr["ControlCollection"];
        Control c = (Control)dr["Control"];
        int index = cc.IndexOf(c);

        //Remove existing Control
        cc.RemoveAt(index);

        Label l = new Label();
        l.CssClass = "lbl";

        //WebControl and HtmlControl don't have an equal Base Class (!)
        if (c is WebControl)
        {
            l.Style.Add("LEFT", ((WebControl)c).Style["LEFT"]);
            l.Style.Add("TOP", ((WebControl)c).Style["TOP"]);
            l.Style.Add("POSITION", ((WebControl)c).Style["POSITION"]);
            l.Style.Add("Z-INDEX", ((WebControl)c).Style["Z-INDEX"]);
        }
        else if (c is HtmlControl)
        {
            l.Style.Add("LEFT", ((HtmlControl)c).Style["LEFT"]);
            l.Style.Add("TOP", ((HtmlControl)c).Style["TOP"]);
            l.Style.Add("POSITION", ((HtmlControl)c).Style["POSITION"]);
            l.Style.Add("Z-INDEX", ((HtmlControl)c).Style["Z-INDEX"]);
        }

        if (c is TextBox) {
            l.Text = ((TextBox)c).Text;
        }
        else if (c is DropDownList || c is RadioButtonList) {
          if (((ListControl)c).SelectedValue != string.Empty)
           l.Text = 
            ((ListControl)c).Items.FindByValue(((ListControl)c).SelectedValue).Text;
        }
        else if (c is CheckBoxList || c is ListBox) {
            if (((ListBox)c).SelectionMode == ListSelectionMode.Multiple) {
              foreach(ListItem li in ((ListBox)c).Items) {
                  if (li.Selected) l.Text += li.Text + _MultiDelimiter;
              }
              if (l.Text.Length > 0)
               l.Text = 
                 l.Text.Substring(0, l.Text.LastIndexOf(_MultiDelimiter));
            }
            else {
                l.Text = ((ListBox)c).SelectedValue;
            }
        }
        else if (c is RadioButton || c is CheckBox) {
            l.Text = ((CheckBox)c).Checked.ToString();
        }
        else {
            //Validators and Buttons should not exist in readonly mode
            if (!(c is BaseValidator) && !(c is Button))
            {
              //unknown type
              throw new 
               ArgumentOutOfRangeException("Controltype not " + 
                 "supported at the moment", c.ToString());
            }
        }
        //Add new read-only Control
        cc.AddAt(index, l);
    }
}

Demo

The base class does support GridLayout and FlowLayout (for both, examples are included).

This code should give you an idea of how to implement the intention and could be enhanced and optimized.

Feel free to add comments.

|°atric|<

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Patrick Spieler

Web Developer

Switzerland Switzerland

Member

Consultant for Trivadis AG in Switzerland.
Interested in .NET, Architectures, Patterns and Web 2.0.
Blog and articles at http://sharpcuts.blogspot.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralGreat Code! Pinmembereltule6:45 12 Jan '07  
Generalcustom control version PinmemberDanInManchester11:40 31 Jan '06  
QuestionAny solution for ViewState? PinmemberBruno Raymond9:36 10 Feb '05  
GeneralGreat, but... Pinmemberrvern11:16 31 Jan '05  
QuestionRe: Great, but... PinmemberAdnanDev13:46 5 May '06  
GeneralNICE PinmemberEric Newton10:13 6 Nov '04  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 25 Feb 2004
Article Copyright 2004 by Patrick Spieler
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid