|
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Trivadis.Spieler.ReadOnly {
/// <summary>
/// Summary description for BasePage.
/// </summary>
public class BasePage: System.Web.UI.Page {
private DataTable _ControlContainer = null;
private string _MultiDelimiter = ", ";
public BasePage():base() {}
/// <summary>
/// Set the passed Controls in a read-only mode
/// </summary>
/// <param name="cc"></param>
public void SetReadOnly(ControlCollection cc) {
CreateDataTable();
CollectControls(cc);
ReplaceControls();
}
/// <summary>
/// Create ControlContainer on the fly
/// (better should be a typed Table / typed object)
/// </summary>
/// <returns></returns>
private DataTable CreateDataTable() {
_ControlContainer = new DataTable("TextBoxes");
DataColumn dcControlColl = new DataColumn("ControlCollection", typeof(System.Object));
DataColumn dcControl = new DataColumn("Control", typeof(System.Object));
DataColumn dcIndex = new DataColumn("Index", typeof(System.Int32));
_ControlContainer.Columns.Add(dcControlColl);
_ControlContainer.Columns.Add(dcControl);
_ControlContainer.Columns.Add(dcIndex);
return _ControlContainer;
}
/// <summary>
/// Replace writable controls with read-only controls
/// </summary>
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 does 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);
}
}
/// <summary>
/// Check all controls inside Collection and put them into a ControlContainer
/// </summary>
/// <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);
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.