using System;
using System.Collections.Specialized;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class User_controls_xmanager_Parameters : UserControl
{
#region Private members
private string _extensionName = string.Empty;
protected ExtensionSettings _settings;
#endregion
public string SettingName { get { return _extensionName; } set { _extensionName = value; } }
public bool GenerateDeleteButton = true;
public bool GenerateEditButton = true;
///
/// Dynamically loads form controls or
/// data grid and binds data to controls
///
///
///
protected void Page_Load(object sender, EventArgs e)
{
_extensionName = ID;
_settings = ExtensionManager.GetSettings(_extensionName);
GenerateDeleteButton = _settings.ShowDelete;
GenerateEditButton = _settings.ShowEdit;
if(_settings.ShowAdd)
CreateFormFields();
if (!Page.IsPostBack)
{
if (_settings.IsScalar)
{
BindScalar();
}
else
{
CreateTemplatedGridView();
BindGrid();
}
}
if (_settings.IsScalar)
{
btnAdd.Text = Resources.labels.save;
}
else
{
if (_settings.ShowAdd)
{
grid.RowEditing += grid_RowEditing;
grid.RowUpdating += grid_RowUpdating;
grid.RowCancelingEdit += delegate { Response.Redirect(Request.RawUrl); };
grid.RowDeleting += grid_RowDeleting;
btnAdd.Text = Resources.labels.add;
}
else
btnAdd.Visible = false;
}
btnAdd.Click += btnAdd_Click;
}
///
/// Handels adding a new value(s)
///
/// Button
/// Arguments
void btnAdd_Click(object sender, EventArgs e)
{
if (IsValidForm())
{
foreach (Control ctl in phAddForm.Controls)
{
if (ctl.GetType().Name == "TextBox")
{
TextBox txt = (TextBox)ctl;
if (_settings.IsScalar)
_settings.UpdateScalarValue(txt.ID, txt.Text);
else
_settings.AddValue(txt.ID, txt.Text);
}
else if (ctl.GetType().Name == "CheckBox")
{
CheckBox cbx = (CheckBox)ctl;
_settings.UpdateScalarValue(cbx.ID, cbx.Checked.ToString());
}
else if (ctl.GetType().Name == "DropDownList")
{
DropDownList dd = (DropDownList)ctl;
_settings.UpdateSelectedValue(dd.ID, dd.SelectedValue);
}
else if (ctl.GetType().Name == "ListBox")
{
ListBox lb = (ListBox)ctl;
_settings.UpdateSelectedValue(lb.ID, lb.SelectedValue);
}
else if (ctl.GetType().Name == "RadioButtonList")
{
RadioButtonList rbl = (RadioButtonList)ctl;
_settings.UpdateSelectedValue(rbl.ID, rbl.SelectedValue);
}
}
ExtensionManager.SaveSettings(_extensionName, _settings);
if (_settings.IsScalar)
{
InfoMsg.InnerHtml = "The values has been saved";
InfoMsg.Visible = true;
}
else
{
BindGrid();
}
}
}
///
/// Deliting row in the data grid
///
/// Grid View
/// Arguments
void grid_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int paramIndex = ParameterValueIndex(sender, e.RowIndex);
foreach (ExtensionParameter par in _settings.Parameters)
{
par.DeleteValue(paramIndex);
}
ExtensionManager.SaveSettings(_extensionName, _settings);
Response.Redirect(Request.RawUrl);
}
///
/// Updating row in the grid
///
/// Grid View
/// Event args
void grid_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
// extract and store input values in the collection
StringCollection updateValues = new StringCollection();
foreach (DataControlFieldCell cel in grid.Rows[e.RowIndex].Controls)
{
foreach (Control ctl in cel.Controls)
{
if (ctl.GetType().Name == "TextBox")
{
TextBox txt = (TextBox)ctl;
updateValues.Add(txt.Text);
}
}
}
int paramIndex = ParameterValueIndex(sender, e.RowIndex);
for (int i = 0; i < _settings.Parameters.Count; i++)
{
string parName = _settings.Parameters[i].Name;
if (_settings.IsRequiredParameter(parName) && string.IsNullOrEmpty(updateValues[i]))
{
// throw error if required field is empty
ErrorMsg.InnerHtml = "\"" + _settings.GetLabel(parName) + "\" is a required field";
ErrorMsg.Visible = true;
e.Cancel = true;
return;
}
else if (parName == _settings.KeyField && _settings.IsKeyValueExists(updateValues[i]))
{
// check if key value was changed; if not, it's ok to update
if (!_settings.IsOldValue(parName, updateValues[i], paramIndex))
{
// trying to update key field with value that already exists
ErrorMsg.InnerHtml = "\"" + updateValues[i] + "\" is already exists";
ErrorMsg.Visible = true;
e.Cancel = true;
return;
}
}
else
_settings.Parameters[i].Values[paramIndex] = updateValues[i];
}
ExtensionManager.SaveSettings(_extensionName, _settings);
Response.Redirect(Request.RawUrl);
}
///
/// Returns index of the parameter calculated
/// based on the page number and size
///
/// GridView object
/// Index of the row in the grid
/// Index of the parameter
private static int ParameterValueIndex(object sender, int rowindex)
{
int paramIndex = rowindex;
GridView gv = (GridView)sender;
if (gv.PageIndex > 0)
{
paramIndex = gv.PageIndex * gv.PageSize + rowindex;
}
return paramIndex;
}
///
/// Editing data in the data grid
///
/// Grid View
/// Event args
void grid_RowEditing(object sender, GridViewEditEventArgs e)
{
grid.EditIndex = e.NewEditIndex;
BindGrid();
}
///
/// Handles page changing event in the data grid
///
///
///
protected void grid_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
grid.PageIndex = e.NewPageIndex;
grid.DataSource = _settings.GetDataTable();
grid.DataBind();
}
///
/// Binds settings values formatted as
/// data table to grid view
///
private void BindGrid()
{
if (GenerateEditButton)
grid.AutoGenerateEditButton = true;
if (GenerateDeleteButton)
grid.AutoGenerateDeleteButton = true;
grid.DataKeyNames = new string[] { _settings.KeyField };
grid.DataSource = _settings.GetDataTable();
grid.DataBind();
}
///
/// Binds single value parameters
/// to text boxes
///
private void BindScalar()
{
foreach (ExtensionParameter par in _settings.Parameters)
{
foreach (Control ctl in phAddForm.Controls)
{
if (ctl.GetType().Name == "CheckBox")
{
CheckBox cbx = (CheckBox)ctl;
if (cbx.ID.ToLower() == par.Name.ToLower())
{
if (par.Values != null && par.Values.Count > 0)
{
cbx.Checked = bool.Parse(par.Values[0]);
}
}
}
if (ctl.GetType().Name == "TextBox")
{
TextBox txt = (TextBox)ctl;
if (txt.ID.ToLower() == par.Name.ToLower())
{
if (par.Values != null)
{
if (par.Values.Count == 0)
txt.Text = string.Empty;
else
txt.Text = par.Values[0];
}
}
}
}
}
}
///
/// Creates template for data grid view
///
void CreateTemplatedGridView()
{
foreach (ExtensionParameter par in _settings.Parameters)
{
BoundField col = new BoundField();
col.DataField = par.Name;
col.HeaderText = par.Name;
grid.Columns.Add(col);
}
}
///
/// Dynamically add controls to the form
///
void CreateFormFields()
{
foreach (ExtensionParameter par in _settings.Parameters)
{
ErrorMsg.InnerHtml = string.Empty;
ErrorMsg.Visible = false;
InfoMsg.InnerHtml = string.Empty;
InfoMsg.Visible = false;
// add label
if (par.ParamType != ParameterType.Boolean)
{
AddLabel(par.Label, "");
}
if (par.ParamType == ParameterType.Boolean)
{
// add checkbox
CheckBox cb = new CheckBox();
cb.Checked = false;
cb.ID = par.Name;
cb.CssClass = "mgrCheck";
phAddForm.Controls.Add(cb);
AddLabel(par.Label, "mgrCheckLbl");
}
else if (par.ParamType == ParameterType.DropDown)
{
// add dropdown
DropDownList dd = new DropDownList();
foreach (string item in par.Values)
{
dd.Items.Add(item);
}
dd.SelectedValue = par.SelectedValue;
dd.ID = par.Name;
dd.Width = 250;
phAddForm.Controls.Add(dd);
}
else if (par.ParamType == ParameterType.ListBox)
{
ListBox lb = new ListBox();
lb.Rows = par.Values.Count;
foreach (string item in par.Values)
{
lb.Items.Add(item);
}
lb.SelectedValue = par.SelectedValue;
lb.ID = par.Name;
lb.Width = 250;
phAddForm.Controls.Add(lb);
}
else if (par.ParamType == ParameterType.RadioGroup)
{
RadioButtonList rbl = new RadioButtonList();
foreach (string item in par.Values)
{
rbl.Items.Add(item);
}
rbl.SelectedValue = par.SelectedValue;
rbl.ID = par.Name;
rbl.RepeatDirection = RepeatDirection.Horizontal;
rbl.CssClass = "mgrRadioList";
phAddForm.Controls.Add(rbl);
}
else
{
// add textbox
TextBox bx = new TextBox();
bx.Text = string.Empty;
bx.ID = par.Name;
bx.Width = new Unit(250);
bx.MaxLength = par.MaxLength;
phAddForm.Controls.Add(bx);
}
Literal br2 = new Literal();
br2.Text = "
";
phAddForm.Controls.Add(br2);
}
}
private void AddLabel(string txt, string cls)
{
Label lbl = new Label();
lbl.Width = new Unit("250");
lbl.Text = txt;
if (!string.IsNullOrEmpty(cls)) lbl.CssClass = cls;
phAddForm.Controls.Add(lbl);
Literal br = new Literal();
br.Text = "
";
phAddForm.Controls.Add(br);
}
///
/// Validate the form
///
/// True if valid
private bool IsValidForm()
{
bool rval = true;
ErrorMsg.InnerHtml = string.Empty;
foreach (Control ctl in phAddForm.Controls)
{
if (ctl.GetType().Name == "TextBox")
{
TextBox txt = (TextBox)ctl;
// check if required
if (_settings.IsRequiredParameter(txt.ID) && string.IsNullOrEmpty(txt.Text.Trim()))
{
ErrorMsg.InnerHtml = "\"" + _settings.GetLabel(txt.ID) + "\" is a required field";
ErrorMsg.Visible = true;
rval = false;
break;
}
// check data type
if (!string.IsNullOrEmpty(txt.Text) && !ValidateType(txt.ID, txt.Text))
{
ErrorMsg.InnerHtml = "\"" + _settings.GetLabel(txt.ID) + "\" must be a " + _settings.GetParameterType(txt.ID);
ErrorMsg.Visible = true;
rval = false;
break;
}
if (!_settings.IsScalar)
{
if (_settings.KeyField == (txt.ID) && _settings.IsKeyValueExists(txt.Text.Trim()))
{
ErrorMsg.InnerHtml = "\"" + txt.Text + "\" is already exists";
ErrorMsg.Visible = true;
rval = false;
break;
}
}
}
}
return rval;
}
protected bool ValidateType(string parameterName, object val)
{
bool retVal = true;
try
{
switch (_settings.GetParameterType(parameterName))
{
case ParameterType.Boolean:
bool.Parse(val.ToString());
break;
case ParameterType.Integer:
int.Parse(val.ToString());
break;
case ParameterType.Long:
long.Parse(val.ToString());
break;
case ParameterType.Float:
float.Parse(val.ToString());
break;
case ParameterType.Double:
double.Parse(val.ToString());
break;
case ParameterType.Decimal:
decimal.Parse(val.ToString());
break;
}
}
catch (Exception)
{
retVal = false;
}
return retVal;
}
///
/// Gets a handle on grid data just before
/// bound them to grid view
///
/// Grid view
/// Event args
protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
AddConfirmDelete((GridView)sender, e);
}
///
/// Adds confirmation box to delete buttons
/// in the data grid
///
/// Data grid view
/// Event args
protected static void AddConfirmDelete(GridView gv, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
return;
foreach (DataControlFieldCell dcf in e.Row.Cells)
{
if (string.IsNullOrEmpty(dcf.Text.Trim()))
{
foreach (Control ctrl in dcf.Controls)
{
LinkButton deleteButton = ctrl as LinkButton;
if (deleteButton != null && deleteButton.Text == "Delete")
{
deleteButton.Attributes.Add("onClick", "return confirm('Are you sure you want to delete this row?');");
break;
}
}
break;
}
}
}
}