Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Enable ReadOnly Mode for your WebForms!

0.00/5 (No votes)
24 Feb 2004 1  
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