Here is my code, if you can fugure out what is missing to have GridView send
correct parameters ?
namespace WTCRM.Settings
{
/// <summary>
/// AddressDataSource is used to manage address datas from a cached dataset
/// </summary>
[AspNetHostingPermission(SecurityAction.Demand, Level =
AspNetHostingPermissionLevel.Minimal),
DefaultProperty("SelectParameters"),
Designer(typeof(WTCRM.Design.AddressDSDesigner), typeof(IDesigner)),
ParseChildren(true),
PersistChildren(false)
]
public class AddressDataSource : DataSourceControl
{
private AddressManagerDB AdMan = new AddressManagerDB();
private Dictionary<string, AddressDataSourceView> dicView = new
Dictionary<string, AddressDataSourceView>();
private DataSet _Ds = null;
private ParameterCollection _SelectParameters = null;
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
public DataSet dsAddress
{
get
{
if (_Ds != null)
return _Ds;
try
{
_Ds = AdMan.GetDsAllAddresses();
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLineIf(PageTraceSwitch.Sw.TraceError,
string.Format("AddressManagerEdit dsAddress : ex : {0}", ex));
throw;
}
return _Ds;
}
}
[
DefaultValue(null),
Editor(typeof(ParameterCollectionEditor), typeof(UITypeEditor)),
MergableProperty(false),
PersistenceMode(PersistenceMode.InnerProperty),
Category("Data")
]
public ParameterCollection SelectParameters
{
get
{
if (_SelectParameters == null)
{
_SelectParameters = new ParameterCollection();
_SelectParameters.ParametersChanged
+= new EventHandler(this.OnSelectParametersChanged);
if (IsTrackingViewState)
{
((IStateManager)_SelectParameters).TrackViewState();
}
}
return _SelectParameters;
}
}
protected override void LoadViewState(object state)
{
object baseState = null;
if (state != null)
{
Pair p = (Pair)state;
baseState = p.First;
if (p.Second != null)
{
((IStateManager)SelectParameters).LoadViewState(p.Second);
}
}
base.LoadViewState(baseState);
}
protected override void OnInit(EventArgs e)
{
Page.LoadComplete += new EventHandler(this.OnPageLoadComplete);
}
private void OnPageLoadComplete(object sender, EventArgs e)
{
if (_SelectParameters != null)
{
_SelectParameters.UpdateValues(Context, this);
}
}
private void OnSelectParametersChanged(object sender, EventArgs e)
{
foreach( KeyValuePair<string, AddressDataSourceView> kvp in dicView)
kvp.Value.RaiseChangedEvent();
}
protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object SelectParameterstate = null;
if (_SelectParameters != null)
{
SelectParameterstate = ((IStateManager)_SelectParameters).SaveViewState();
}
if ((baseState != null) || (SelectParameterstate != null))
{
return new Pair(baseState, SelectParameterstate);
}
return null;
}
protected override void TrackViewState()
{
base.TrackViewState();
if (_SelectParameters != null)
{
((IStateManager)_SelectParameters).TrackViewState();
}
}
public AddressDataSource()
: base()
{
}
public bool HasView(string viewName)
{
return dicView.ContainsKey(viewName);
}
// Return a strongly typed view for the current data source control.
protected override DataSourceView GetView(string viewName)
{
AddressDataSourceView view;
if (!dicView.ContainsKey(viewName))
{
view = new AddressDataSourceView(this, viewName);
dicView.Add(viewName, view);
}
else view = dicView[viewName];
return view;
}
// calls the DataSourceControl.GetViewNames method.
public string[] GetArViewNames()
{
DataSet ds = dsAddress;
string[] list = new string[ds.Tables.Count];
int i=0;
foreach( DataTable Tb in ds.Tables)
list[i++] = Tb.TableName;
return list;
}
// calls the DataSourceControl.GetViewNames method.
protected override ICollection GetViewNames()
{
DataSet ds = dsAddress;
return ds.Tables as ICollection;
}
#region insert operations
/// <summary>
/// Insert a new city, rebind the page and select the inserted row in
display
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public int InsertCity(IDictionary values)
{
string name = (string)values["wt_CityName"];
int ret = AdMan.InsertCity(name);
GridView ctl = (GridView)Page.FindControl("GVCities");
Page.DataBind();
if (ctl != null)
{
string strval = ret.ToString();
for (int i = 0; i < ctl.Rows.Count; i++)
{
GridViewRow gr = ctl.Rows;
if (gr.Cells.Count > 1 && gr.Cells[1].Text == strval)
{
ctl.SelectedIndex = i;
break;
}
}
}
return ret;
}
/// <summary>
/// Insert a street name for selected city
/// get cityId form the listbox becaused user can select another city than
the display selected one
/// rebind the page
/// </summary>
/// <param name="cityId"></param>
/// <param name="name"></param>
/// <returns></returns>
public int InsertStreet(IDictionary values)
{
DetailsView ctl = (DetailsView)Page.FindControl("DVStreet");
DropDownList ddl = (DropDownList)ctl.FindControl("DDLCity1");
int ret = 0;
if (ddl == null)
return ret;
int cityId = int.Parse(ddl.SelectedValue);
string name = (string)values["wt_StreetName"];
ret = AdMan.InsertStreet(cityId, name);
ctl.Page.DataBind();
GridView ctl2 = (GridView)Page.FindControl("GVStreets");
if (ctl2 != null)
{
string strval = ret.ToString();
for (int i = 0; i < ctl2.Rows.Count; i++)
{
GridViewRow gr = ctl2.Rows;
if (gr.Cells.Count > 1 && gr.Cells[1].Text == strval)
{
ctl2.SelectedIndex = i;
break;
}
}
}
return ret;
}
public int InsertStreetPart(IDictionary values)
{
DropDownList ddlS = (DropDownList)Page.FindControl("LBStreets");
DetailsView ctl = (DetailsView)Page.FindControl("DVStreetPart");
int ret = 0;
if (ctl == null || ddlS == null)
return ret;
int streetId = int.Parse(ddlS.SelectedValue);
DropDownList ddl = (DropDownList)ctl.FindControl("DDLSide");
int sideId = int.Parse(ddl.SelectedValue);
ddl = (DropDownList)ctl.FindControl("DDLSuffix1");
int numInf = int.Parse((string)values["wt_StreetPartNumInf"]);
int suffixInf = int.Parse(ddl.SelectedValue);
int numSup = int.Parse((string)values["wt_StreetPartNumSup"]);
ddl = (DropDownList)ctl.FindControl("DDLSuffix2");
int suffixSup = int.Parse(ddl.SelectedValue);
ddl = (DropDownList)ctl.FindControl("DDLMicroSector");
int microSectorId = int.Parse(ddl.SelectedValue);
string name = (string)values["wt_StreetPartName"];
ret = AdMan.InsertStreetPart(streetId, sideId, numInf, suffixInf, numSup,
suffixSup, microSectorId, name);
// to avoid loosing city selection during rebind
DropDownList ddlC = (DropDownList)Page.FindControl("LBStreetCities");
Page.DataBind();
GridView ctl2 = (GridView)Page.FindControl("GVStreetParts");
if (ctl2 != null)
{
string strval = ret.ToString();
for (int i = 0; i < ctl2.Rows.Count; i++)
{
GridViewRow gr = ctl2.Rows;
if (gr.Cells.Count > 1 && gr.Cells[1].Text == strval)
{
ctl2.SelectedIndex = i;
break;
}
}
}
return ret;
}
public int InsertMicroSector(IDictionary values)
{
DetailsView ctl = (DetailsView)Page.FindControl("DVMicroSecteur");
int ret = 0;
if (ctl == null)
return ret;
DropDownList ddl = (DropDownList)ctl.FindControl("DDLSector2");
int sectorId = int.Parse(ddl.SelectedValue);
string name = (string)values["wt_MicroSectorName"];
ret = AdMan.InsertMicroSector(sectorId, name);
this.Page.DataBind();
GridView ctl2 = (GridView)Page.FindControl("GVMicroSector");
if (ctl != null)
{
string strval = ret.ToString();
for (int i = 0; i < ctl2.Rows.Count; i++)
{
GridViewRow gr = ctl2.Rows;
if (gr.Cells.Count > 1 && gr.Cells[1].Text == strval)
{
ctl2.SelectedIndex = i;
break;
}
}
}
return ret;
}
#endregion insert
#region update operations
public void UpdateCity(IDictionary keys, IDictionary values, IDictionary
oldValues)
{
if (values != null && values.Count > 0)
{
string nm = (string)values["wt_CityName"];
GridView gv = (GridView)Page.FindControl("GVCities");
if (gv.EditIndex != -1)
{
int Id = int.Parse(gv.Rows[gv.EditIndex].Cells[1].Text);
AdMan.UpdateCity(Id, nm);
}
}
}
public void UpdateStreet(IDictionary keys, IDictionary values, IDictionary
oldValues)
{
if (values != null && values.Count > 0)
{
string nm = (string)values["wt_StreetName"];
GridView gv = (GridView)Page.FindControl("GVStreets");
if (gv.EditIndex != -1)
{
int Id = int.Parse(gv.Rows[gv.EditIndex].Cells[1].Text);
AdMan.UpdateStreet(Id, nm);
}
}
}
public void UpdateStreetPart(IDictionary keys, IDictionary values,
IDictionary oldValues)
{
if (values != null && values.Count > 0)
{
int streetId = (int)values["wt_StreetId"];
int sideId = (int)values["wt_SideId"];
int numInf = (int)values["wt_StreetPartNumInf"];
int suffixInf = (int)values["wt_SuffixInf"];
int numSup = (int)values["wt_StreetPartNumSup"];
int suffixSup = (int)values["wt_SuffixSup"];
int microSectorId = (int)values["wt_MicroSectorId"];
string nm = (string)values["wt_StreetName"];
GridView gv = (GridView)Page.FindControl("GVStreetParts");
if (gv.EditIndex != -1)
{
int Id = int.Parse(gv.Rows[gv.EditIndex].Cells[1].Text);
AdMan.UpdateStreetPart(Id, streetId, sideId, numInf, suffixInf, numSup,
suffixSup, microSectorId, nm);
}
}
}
public void UpdateSector(IDictionary keys, IDictionary values, IDictionary
oldValues)
{
if (values != null && values.Count > 0)
{
string nm = (string)values["wt_SectorName"];
GridView gv = (GridView)Page.FindControl("DLSectors");
if (gv.EditIndex != -1)
{
int Id = int.Parse(gv.Rows[gv.EditIndex].Cells[1].Text);
AdMan.UpdateSector(Id, nm);
}
}
}
public void UpdateMicroSector(IDictionary keys, IDictionary values,
IDictionary oldValues)
{
if (values != null && values.Count > 0)
{
string nm = (string)values["wt_MicroSectorName"];
GridView gv = (GridView)Page.FindControl("GVMicroSector");
if (gv.EditIndex != -1)
{
int Id = int.Parse(gv.Rows[gv.EditIndex].Cells[1].Text);
AdMan.UpdateMicroSector(Id, nm);
}
}
}
#endregion update
#region delete operations
public void DeleteCity(IDictionary keys, IDictionary values)
{
if ( keys != null && keys.Count > 0)
{
int Id = (int)keys["wt_CityId"];
AdMan.DeleteCity(Id);
}
}
public void DeleteStreet(IDictionary keys, IDictionary values)
{
if (keys != null && keys.Count > 0)
{
int Id = (int)keys["wt_StreetId"];
AdMan.DeleteStreet(Id);
}
}
public void DeleteStreetPart(IDictionary keys, IDictionary values)
{
if (keys != null && keys.Count > 0)
{
int Id = (int)keys["wt_StreetPartId"];
AdMan.DeleteStreetPart(Id);
}
}
public void DeleteSector(IDictionary keys, IDictionary values)
{
if (keys != null && keys.Count > 0)
{
int Id = (int)keys["wt_SectorId"];
AdMan.DeleteSector(Id);
}
}
public void DeleteMicroSector(IDictionary keys, IDictionary values)
{
if (keys != null && keys.Count > 0)
{
int Id = (int)keys["wt_MicroSectorId"];
AdMan.DeleteMicroSector(Id);
}
}
#endregion delete
}
// The AddressDataSourceView class encapsulates the
// capabilities of the CsvDataSource data source control.
public class AddressDataSourceView : DataSourceView
{
const string cityTbName = "wt_city";
const string streetTbName = "wt_street";
const string streetPartTbName = "wt_streetpart";
const string sectorTbName = "wt_sector";
const string microSectorTbName = "wt_microsector";
AddressDataSource AddressDs = null;
public AddressDataSourceView(IDataSource owner, string name)
: base(owner, name)
{
AddressDs = (AddressDataSource)owner;
}
internal void RaiseChangedEvent()
{
OnDataSourceViewChanged(EventArgs.Empty);
}
// Get data from the underlying data source.
// Build and return a DataView, regardless of mode.
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments
selectArgs)
{
DataSet ds = AddressDs.dsAddress;
DataTable data = ds.Tables[Name];
DataView dataView = new DataView(data);
if (AddressDs.SelectParameters.Count > 0)
{
StringBuilder sb = new StringBuilder();
bool first = true;
bool existFilter = false;
foreach (Parameter p in AddressDs.SelectParameters)
{
if (!(p is ControlParameter))
continue;
ControlParameter p1 = (ControlParameter)p;
Control ctl = AddressDs.Page.FindControl(p1.ControlID);
if (ctl == null)
continue;
existFilter = true;
if (p1.PropertyName == "SelectedValue")
{
string val = string.Empty;
if (ctl is DropDownList && ((DropDownList)ctl).SelectedValue != null)
val = ((DropDownList)ctl).SelectedValue;
else if (ctl is GridView )
{
GridView gv = (GridView)ctl;
if (gv.SelectedValue != null)
{
if (gv.SelectedValue is IDictionary)
val = ((IDictionary)gv.SelectedValue)[p1.ControlID].ToString();
else val = gv.SelectedValue.ToString();
}
}
if (first)
{
if (string.IsNullOrEmpty(val))
sb.AppendFormat("{0} is null", p1.Name);
else sb.AppendFormat("{0} = '{1}'", p1.Name, val);
first = false;
}
else
{
if (string.IsNullOrEmpty(val))
sb.AppendFormat(" and {0} is null", p1.Name);
else sb.AppendFormat(" and {0} = '{1}'", p1.Name, val);
}
}
}
if (existFilter)
{
try
{
dataView.RowFilter = sb.ToString();
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLineIf(DBTraceSwitch.Sw.TraceError,
string.Format("AddressDataSourceView ExecuteSelect ViewName: {0}, ex : {1}",
Name, ex));
}
}
}
if (selectArgs.SortExpression != String.Empty)
{
dataView.Sort = selectArgs.SortExpression;
}
return dataView;
}
// The AddressDataSourceView does ue
// permit deletion. You can modify or extend
// this sample to do so.
public override bool CanDelete
{
get
{
return true;
}
}
/// <summary>
/// Called when a delete button is clicked in a GridView
/// Find the corresoponding Table from the viewName and call correspkinding
delete method on the Datasource control attached
/// </summary>
/// <param name="keys"></param>
/// <param name="values"></param>
/// <returns></returns>
protected override int ExecuteDelete(IDictionary keys,IDictionary values)
{
switch (Name.ToLower())
{
case cityTbName:
AddressDs.DeleteCity(keys,values);
break;
case streetTbName:
AddressDs.DeleteStreet(keys, values);
break;
default:
return 0;
case streetPartTbName:
AddressDs.DeleteStreetPart(keys, values);
break;
break;
case sectorTbName:
AddressDs.DeleteSector(keys, values);
break;
case microSectorTbName:
AddressDs.DeleteMicroSector(keys, values);
break;
}
return 1;
}
// The AddressDataSourceView does not currently
// permit insertion of a new record. You can
// modify or extend this sample to do so.
public override bool CanInsert
{
get
{
return true;
}
}
protected override int ExecuteInsert(IDictionary values)
{
switch (Name.ToLower())
{
case cityTbName:
AddressDs.InsertCity(values);
break;
case streetTbName:
AddressDs.InsertStreet(values);
break;
default:
return 0;
case streetPartTbName:
AddressDs.InsertStreetPart(values);
break;
case microSectorTbName:
AddressDs.InsertMicroSector(values);
break;
}
return 1;
}
// The AddressDataSourceView does not currently
// permit update operations. You can modify or
// extend this sample to do so.
public override bool CanUpdate
{
get
{
return true;
}
}
protected override int ExecuteUpdate(IDictionary keys, IDictionary values,
IDictionary oldValues)
{
switch (Name.ToLower())
{
case cityTbName:
AddressDs.UpdateCity(keys,values,oldValues);
break;
case streetTbName:
AddressDs.UpdateStreet(keys, values, oldValues);
break;
default:
return 0;
case streetPartTbName:
AddressDs.UpdateStreetPart(keys, values, oldValues);
break;
case sectorTbName:
AddressDs.UpdateSector(keys, values, oldValues);
break;
case microSectorTbName:
AddressDs.UpdateMicroSector(keys, values, oldValues);
break;
}
return 1;
}
}
}