Click here to Skip to main content
15,867,141 members
Articles / Web Development / ASP.NET
Article

Enable ReadOnly Mode for your WebForms!

Rate me:
Please Sign up or sign in to vote.
4.68/5 (20 votes)
24 Feb 2004 70.4K   726   41   6
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):

C#
/// 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...

C#
/// 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


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

Comments and Discussions

 
GeneralGreat Code! Pin
eltule12-Jan-07 6:45
eltule12-Jan-07 6:45 
Generalcustom control version Pin
DanInManchester31-Jan-06 11:40
DanInManchester31-Jan-06 11:40 
QuestionAny solution for ViewState? Pin
Bruno Raymond10-Feb-05 9:36
Bruno Raymond10-Feb-05 9:36 
GeneralGreat, but... Pin
rvern31-Jan-05 11:16
rvern31-Jan-05 11:16 
QuestionRe: Great, but... Pin
AdnanDev5-May-06 13:46
AdnanDev5-May-06 13:46 
Hi Randy:

I really appriciate if u can email me the VB code.

Thanks,
Adnan
GeneralNICE Pin
Eric Newton6-Nov-04 10:13
Eric Newton6-Nov-04 10:13 

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

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