using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace WEBSWAPP.Website.CodeSamples.ASPNET2.ITemplate
{
public class FormattedTemplate2 : System.Web.UI.ITemplate, INamingContainer
{
System.Web.UI.WebControls.ListItemType _type;
DataColumnCollection _dccol;
private System.Collections.Hashtable Fields;
public bool ShowEdit = false;
public FormattedTemplate2(System.Web.UI.WebControls.ListItemType type, DataColumnCollection dccol, bool showEdit)
{
_type = type;
_dccol = dccol;
ShowEdit = showEdit;
}
public void InstantiateIn(System.Web.UI.Control container)
{
Fields = new System.Collections.Hashtable();
//create a table within the ItemTemplate
Table tbl = new Table();
TableRow tr = null;
TableCell td = null;
container.Controls.Add(tbl);
foreach (DataColumn dc in _dccol)
{
if (dc.ColumnName != null)
{
//for each DataColum create a TableRow with 2 cells
tr = new TableRow();
tbl.Rows.Add(tr);
td = new TableCell();
tr.Cells.Add(td);
td.Text = FormatHeader(dc.ColumnName);
td.CssClass = "FormViewLabel1";
td = new TableCell();
tr.Cells.Add(td);
SetAColumn(td, dc);
}
}
//if ShowEdit is set to true add a LinkButton for Edit within the ItemTemplate
//and 2 linkButons (Update, Cancel) for the EditItemTemplate
tr = new TableRow();
tbl.Rows.Add(tr);
td = new TableCell();
tr.Cells.Add(td);
if (_type == System.Web.UI.WebControls.ListItemType.Item)
{
td.ColumnSpan = 2;
LinkButton lnkEdit = new LinkButton();
lnkEdit.Text = "Edit";
lnkEdit.ToolTip = "Click here to turn on the EditItemTemplate of the FormView";
lnkEdit.CommandName = "Edit";
td.Controls.Add(lnkEdit);
}
else
{
LinkButton lnkButton = new LinkButton();
lnkButton.Text = "Cancel";
lnkButton.ToolTip = "Click here to cancel the Edit process";
lnkButton.CommandName = "Cancel";
td.Controls.Add(lnkButton);
td = new TableCell();
tr.Cells.Add(td);
lnkButton = new LinkButton();
lnkButton.Text = "Update";
lnkButton.ToolTip = "Click here to update the record";
lnkButton.CommandName = "Update";
td.Controls.Add(lnkButton);
}
//
}
private string FormatHeader(string inputString)
{
string ret = null;
foreach (char c in inputString)
{
if (c < 'a')
ret += " " + c;
else
ret += c;
}
return ret;
}
private Control SetAColumn(TableCell td, DataColumn _dc)
{
TextBox txt = null;
Label lbl = null;
RegularExpressionValidator rexpval = null;
RangeValidator rangeVal = null;
switch (_type)
{
case System.Web.UI.WebControls.ListItemType.Item:
//if datacolumn is readonly and unique then it is a primary key
//render it as label a distinctive style
lbl = new Label();
lbl.ID = "lbl" + _dc.ColumnName;
Fields.Add(lbl.ID, _dc.ColumnName);
if (_dc.ReadOnly && _dc.Unique)
{
lbl.CssClass = "PrimaryKeyCell";
}
//compose a tooltip from the column attributes
lbl.ToolTip = _dc.ColumnName + " is of type " + _dc.DataType.ToString();
if (_dc.ReadOnly) lbl.ToolTip += ", Readonly";
if (_dc.Unique) lbl.ToolTip += ", Unique";
if (_dc.DefaultValue.Equals(DBNull.Value)) lbl.ToolTip += ", Default value is DBNull";
if (!_dc.Expression.Equals(string.Empty)) lbl.ToolTip += ", a calculated field based on " + _dc.Expression.ToString();
td.Controls.Add(lbl);
lbl.DataBinding += new EventHandler(lbl_DataBinding);
break;
case System.Web.UI.WebControls.ListItemType.EditItem:
if (_dc.ReadOnly || (_dc.ReadOnly && _dc.Unique))
{
lbl = new Label();
lbl.ID = "lbl" + _dc.ColumnName;
Fields.Add(lbl.ID, _dc.ColumnName);
lbl.CssClass = "PrimaryKeyCell";
//compose a tooltip from the column attributes
lbl.ToolTip = _dc.ColumnName + " is of type " + _dc.DataType.ToString();
if (_dc.ReadOnly) lbl.ToolTip += ", Readonly";
if (_dc.Unique) lbl.ToolTip += ", Unique";
if (_dc.DefaultValue.Equals(DBNull.Value)) lbl.ToolTip += ", Default value is DBNull";
td.Controls.Add(lbl);
lbl.DataBinding += new EventHandler(lbl_DataBinding);
}
else
{
switch (_dc.DataType.ToString())
{
case "System.Boolean":
RadioButtonList rbl = new RadioButtonList();
rbl.ID = "rbl" + _dc.ColumnName;
Fields.Add(rbl.ID, _dc.ColumnName);
System.Web.UI.WebControls.ListItem li = new System.Web.UI.WebControls.ListItem("Yes", "True");
rbl.Items.Add(li);
rbl.RepeatLayout = RepeatLayout.Flow;
rbl.RepeatDirection = RepeatDirection.Horizontal;
li = new System.Web.UI.WebControls.ListItem("No", "False");
rbl.Items.Add(li);
rbl.DataBound += new EventHandler(rbl_DataBound);
td.Controls.Add(rbl);
break;
case "System.String":
txt = new TextBox();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
txt.MaxLength = _dc.MaxLength;
txt.Width = Unit.Pixel(_dc.MaxLength * 6);
td.Controls.Add(txt);
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
case "System.Int16":
txt = new TextBox();
if (_dc.DefaultValue.Equals(DBNull.Value)) txt.ToolTip = _dc.ColumnName + " is of type " + _dc.DataType.ToString();
if (!_dc.Expression.Equals(string.Empty)) txt.ToolTip += ", a calculated field based on " + _dc.Expression.ToString();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
td.Controls.Add(txt);
txt.MaxLength = 5;
txt.Width = Unit.Pixel(40);
rangeVal = new RangeValidator();
rangeVal.ControlToValidate = txt.ID;
rangeVal.MaximumValue = "32767";
rangeVal.MinimumValue = "-32767";
rangeVal.Display = ValidatorDisplay.Dynamic;
rangeVal.Text = "*";
rangeVal.ErrorMessage = "Entered value for " + _dc.ColumnName + " is not valid for an int16 type";
rangeVal.Type = ValidationDataType.Integer;
td.Controls.Add(rangeVal);
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
case "System.Int32":
txt = new TextBox();
if (_dc.DefaultValue.Equals(DBNull.Value)) txt.ToolTip = _dc.ColumnName + " is of type " + _dc.DataType.ToString();
if (!_dc.Expression.Equals(string.Empty)) txt.ToolTip += ", a calculated field based on " + _dc.Expression.ToString();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
td.Controls.Add(txt);
txt.MaxLength = 10;
txt.Width = Unit.Pixel(60);
rangeVal = new RangeValidator();
rangeVal.ControlToValidate = txt.ID;
rangeVal.MaximumValue = "2147483647";
rangeVal.MinimumValue = "-2147483648";
rangeVal.Display = ValidatorDisplay.Dynamic;
rangeVal.Text = "*";
rangeVal.ErrorMessage = "Entered value for " + _dc.ColumnName + " is not valid for an int32 type";
rangeVal.Type = ValidationDataType.Integer;
td.Controls.Add(rangeVal);
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
case "System.Int64":
txt = new TextBox();
if (_dc.DefaultValue.Equals(DBNull.Value)) txt.ToolTip = _dc.ColumnName + " is of type " + _dc.DataType.ToString();
if (!_dc.Expression.Equals(string.Empty)) txt.ToolTip += ", a calculated field based on " + _dc.Expression.ToString();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
td.Controls.Add(txt);
txt.MaxLength = 19;
txt.Width = Unit.Pixel(60);
rangeVal = new RangeValidator();
rangeVal.ControlToValidate = txt.ID;
rangeVal.MaximumValue = "9223372036854775807";
rangeVal.MinimumValue = "-9223372036854775808";
rangeVal.Display = ValidatorDisplay.Dynamic;
rangeVal.Text = "*";
rangeVal.ErrorMessage = "Entered value for " + _dc.ColumnName + " is not valid for an int64 type";
rangeVal.Type = ValidationDataType.Integer;
td.Controls.Add(rangeVal);
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
case "System.Decimal":
txt = new TextBox();
if (_dc.DefaultValue.Equals(DBNull.Value)) txt.ToolTip = _dc.ColumnName + " is of type " + _dc.DataType.ToString();
if (!_dc.Expression.Equals(string.Empty)) txt.ToolTip += ", a calculated field based on " + _dc.Expression.ToString();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
td.Controls.Add(txt);
txt.MaxLength = 19;
txt.Width = Unit.Pixel(60);
rexpval = new RegularExpressionValidator();
rexpval.ValidationExpression = @"^\d*.?\d{0,2}$";
rexpval.Display = ValidatorDisplay.Dynamic;
rexpval.Text = "*";
rexpval.ErrorMessage = "Entered value for " + _dc.ColumnName + " is not valid for Decimal type";
rexpval.ControlToValidate = txt.ID;
td.Controls.Add(rexpval);
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
case "System.DateTime":
txt = new TextBox();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
txt.MaxLength = 10;
txt.Width = Unit.Pixel(80);
td.Controls.Add(txt);
rexpval = new RegularExpressionValidator();
rexpval.ValidationExpression = @"^\(?\d{3}[\)\-\s]?\d{3}[-\s]?\d{4}$";
rexpval.ControlToValidate = txt.ID;
rexpval.Display = ValidatorDisplay.Dynamic;
rexpval.Text = "*";
rexpval.ErrorMessage = "Entered value for " + _dc.ColumnName + " is not a valid date entry";
td.Controls.Add(rexpval);
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
default:
txt = new TextBox();
txt.ID = "txt" + _dc.ColumnName;
Fields.Add(txt.ID, _dc.ColumnName);
td.Controls.Add(txt);
if (txt.MaxLength > 0)
{
txt.MaxLength = _dc.MaxLength;
txt.Width = Unit.Pixel(_dc.MaxLength * 6);
}
txt.DataBinding += new EventHandler(txt_DataBinding);
break;
}
}
break;
}
return lbl;
}
void txt_DataBinding(object sender, EventArgs e)
{
TextBox txt = (TextBox)sender;
DataRowView drv = null;
DataColumn _dc = _dccol[Fields[txt.ID].ToString()];
drv = (DataRowView)((FormView)txt.NamingContainer).DataItem;
switch (_dc.DataType.ToString())
{
case "System.String":
txt.Text = drv[_dc.ColumnName].ToString();
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "int":
if (Convert.ToInt64(drv[_dc.ColumnName]) < 0) txt.CssClass = "NegativeNumber";
txt.Text = Convert.ToInt64(drv[_dc.ColumnName]).ToString("#0");
break;
case "System.Decimal":
if (Convert.ToDecimal(drv[_dc.ColumnName]) < 0) txt.CssClass = "NegativeNumber";
txt.Text = Convert.ToDecimal(drv[_dc.ColumnName]).ToString("#0.00");
break;
case "System.DateTime":
if (Convert.ToDateTime(drv[_dc.ColumnName]) > DateTime.Now) txt.CssClass = "LateDate";
txt.Text = Convert.ToDateTime(drv[_dc.ColumnName]).ToString("MM/dd/yyyy");
break;
default:
txt.Text = drv[_dc.ColumnName].ToString();
break;
}
}
void rbl_DataBound(object sender, EventArgs e)
{
RadioButtonList rbl = ((RadioButtonList)sender);
DataRowView drv = null;
DataColumn _dc = _dccol[Fields[rbl.ID].ToString()];
drv = (DataRowView)((FormView)rbl.NamingContainer).DataItem;
rbl.SelectedValue = drv[_dc.ColumnName].ToString();
}
void lbl_DataBinding(object sender, EventArgs e)
{
Label lbl = ((Label)sender);
DataRowView drv = null;
drv = (DataRowView)((FormView)lbl.NamingContainer).DataItem;
DataColumn _dc = _dccol[Fields[lbl.ID].ToString()];
//change the data format based on the data if the datacolumn is not a primary key field
if (_dc.ReadOnly && _dc.Unique)
{
lbl.Text = drv[_dc.ColumnName].ToString();
}
else
{
switch (_dc.DataType.ToString())
{
case "System.DateTime":
lbl.Text = ((DateTime)drv[_dc.ColumnName]).ToString("ddd, MMM dd, yyyy");
if ((DateTime)drv[_dc.ColumnName] > DateTime.Now) lbl.CssClass = "LateDate";
break;
case "System.Decimal":
lbl.Text = ((Decimal)drv[_dc.ColumnName]).ToString("#0.00");
if ((Decimal)drv[_dc.ColumnName] < 0) lbl.CssClass = "NegativeNumber";
break;
case "System.Boolean":
lbl.Text = Convert.ToBoolean(drv[_dc.ColumnName]) ? "Yes" : "No";
break;
default:
lbl.Text = drv[_dc.ColumnName].ToString();
break;
}
}
}
}
}