B
bne
Hi All,
I have a shopping cart app that (I think) has broken due to an upgrade
to .NET 2.0.
Some products display fine:
<http://ukweddinggroup.com/default.aspx?prd=11>
Others display okay but validation on the dropdown list options break:
<http://ukweddinggroup.com/default.aspx?prd=249>
And still others completely wipe out with "System.ArgumentException: An
entry with the same key already exists":
<http://ukweddinggroup.com/default.aspx?prd=420>
The drop down list controls are created dynamically depending on what
options are available for each product in the database.
I'm presuming that there is a bug somewhere that was forgiven by .NET
1.1 but has now cropped up in .NET 2.0
The code that the runtime error objects to is:
System.ArgumentException: An entry with the same key already exists.
------------------------------------------------------
@ <span id="itemPriceIndicator"><%= this.ItemPrice.ToString("c")
%></span></strong></span>
------------------------------------------------------
ItemPrice is from an overridden page control used across the site:
------------------------------------------------------
public decimal ItemPrice
{
get
{
object o = ViewState["ItemPrice"];
if(o == null)
{
return 0.0M;
}
return (decimal)o;
}
set
{
ViewState["ItemPrice"] = value;
}
}
------------------------------------------------------
The code where I think something is going wrong is:
------------------------------------------------------
private void rptProductOptions_ItemCreated(object sender,
RepeaterItemEventArgs e)
{
if(e.Item != null && (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem))
{
PlaceHolder plh = (PlaceHolder)e.Item.FindControl("plhControl");
DataSet dsProductOptionData = this.ProductOptionData();
DataRow drOptionGroup =
dsProductOptionData.Tables["OptionGroup"].Rows[e.Item.ItemIndex];
DataView dvOptions = new DataView(
dsProductOptionData.Tables["Option"],
String.Format("OptionGroupID = {0}", drOptionGroup["ID"]),
"Incidence",
DataViewRowState.OriginalRows);
// JS price array
foreach(DataRowView drv in dvOptions)
{
RegisterArrayDeclaration("aPrice", drv["Price"].ToString());
}
bool mandatory = Convert.ToBoolean(drOptionGroup["Mandatory"]);
HYL.Cart.OptionGroupType type =
(HYL.Cart.OptionGroupType)Enum.Parse(typeof(HYL.Cart.OptionGroupType),
drOptionGroup["Type"].ToString());
RequiredFieldValidator rfv;
if(type == OptionGroupType.List || type ==
OptionGroupType.MultipleList)
{
#region Lists
// display checkbox as only 1 option
if(dvOptions.Count == 1)
{
CheckBox cbx = new CheckBox();
if(mandatory)
{
cbx.Checked = true;
cbx.Enabled = false;
this.ItemPrice += Convert.ToDecimal(dvOptions[0]["Price"]);
}
else
{
cbx.Attributes.Add("onclick", "UpdatePrice();");
}
cbx.Text = dvOptions[0]["Description"].ToString();
cbx.CssClass = "ProductOption";
plh.Controls.Add(cbx);
}
else if(dvOptions.Count > 1) // display drop down list/listbox
{
if(type == HYL.Cart.OptionGroupType.MultipleList)
{
ListBox lbx = new ListBox();
lbx.Attributes.Add("onchange", "UpdatePrice();");
lbx.CssClass = "ProductOption";
lbx.Rows = 5;
lbx.SelectionMode = ListSelectionMode.Multiple;
lbx.DataTextField = "Description";
lbx.DataValueField = "ID";
lbx.DataSource = dvOptions;
lbx.DataBind();
plh.Controls.Add(lbx);
// to add client id after everything has finished databinding
lbx.PreRender += new EventHandler(lbx_PreRender);
if(mandatory)
{
rfv = new RequiredFieldValidator();
rfv.CssClass = "errText";
rfv.Display = ValidatorDisplay.Dynamic;
rfv.Text = "Please select an option.<br>";
rfv.ControlToValidate = lbx.ClientID;
plh.Controls.AddAt(0, rfv);
}
}
else
{
DropDownList ddl = new DropDownList();
ddl.Attributes.Add("onchange", "UpdatePrice();");
ddl.CssClass = "ProductOption";
ddl.DataTextField = "Description";
ddl.DataValueField = "ID";
ddl.DataSource = dvOptions;
ddl.DataBind();
plh.Controls.Add(ddl);
// to add blank option and client id after everything has
finished databinding
ddl.PreRender += new EventHandler(ddl_PreRender);
if(mandatory)
{
rfv = new RequiredFieldValidator();
rfv.CssClass = "errText";
rfv.Display = ValidatorDisplay.Dynamic;
rfv.Text = "Please select an option.<br>";
rfv.ControlToValidate = ddl.ClientID;
rfv.InitialValue = "0";
plh.Controls.AddAt(0, rfv);
}
}
}
#endregion
}
else if(type == OptionGroupType.IntegerInput || type ==
OptionGroupType.StringInput)
{
#region TextBoxes
TextBox txt = new TextBox();
if(type == OptionGroupType.IntegerInput)
{
txt.CssClass = "txtFieldSm";
}
else
{
txt.CssClass = "txtField";
txt.TextMode = TextBoxMode.MultiLine;
}
plh.Controls.Add(txt);
txt.PreRender += new EventHandler(txt_PreRender);
if(mandatory)
{
if(type == OptionGroupType.IntegerInput)
{
CompareValidator cmpv = new CompareValidator();
cmpv.CssClass = "errText";
cmpv.Display = ValidatorDisplay.Dynamic;
cmpv.Text = "Please enter a valid number.<br>";
cmpv.Type = ValidationDataType.Integer;
cmpv.Operator = ValidationCompareOperator.DataTypeCheck;
cmpv.ControlToValidate = txt.ClientID;
plh.Controls.AddAt(0, cmpv);
}
else
{
rfv = new RequiredFieldValidator();
rfv.CssClass = "errText";
rfv.Display = ValidatorDisplay.Dynamic;
rfv.Text = "Please enter a value.<br>";
rfv.ControlToValidate = txt.ClientID;
plh.Controls.AddAt(0, rfv);
}
}
#endregion
}
else if(type == OptionGroupType.DateInput)
{
#region Date Drop Downs
HYL.Web.Controls.DateDropDown ddd = new
HYL.Web.Controls.DateDropDown();
ddd.DateValue = DateTime.Today;
ddd.CalendarLinkText = "<img class=\"icoCalendar\" alt=\"calendar
select\" src=\"img/ico_calendar.gif\">";
ddd.CalendarPosition = 3;
ddd.CalendarStylePath = "@import 'Page/pfcal.css';";
ddd.DisplayFormat = "dMMMMyyyy";
ddd.ShowCalendar = true;
ddd.CssClass = "dateDropDown";
ddd.YearUpperBound = 3;
plh.Controls.Add(ddd);
ddd.PreRender += new EventHandler(ddd_PreRender);
if(mandatory)
{
DateTime minDate = DateTime.Today.AddDays(7);
ddd.DisabledDates = new HYL.Web.Controls.SelectionRange[] { new
HYL.Web.Controls.SelectionRange(DateTime.MinValue, minDate) };
ddd.DateValue = minDate;
HYL.Web.Controls.DateDropDownCompareValidator dcv = new
HYL.Web.Controls.DateDropDownCompareValidator();
dcv.CssClass = "errText";
dcv.Display = ValidatorDisplay.Dynamic;
dcv.Text = "Please enter a date at least 1 week from
today.<br>";
dcv.DateToCompare = minDate;
dcv.Operator = ValidationCompareOperator.GreaterThanEqual;
dcv.ControlToValidate = ddd.ClientID;
plh.Controls.AddAt(0, dcv);
}
#endregion
}
else if(type == OptionGroupType.None)
{
// do nothing
}
}
}
------------------------------------------------------
Anyone got an bright ideas?
Cheers
bne
I have a shopping cart app that (I think) has broken due to an upgrade
to .NET 2.0.
Some products display fine:
<http://ukweddinggroup.com/default.aspx?prd=11>
Others display okay but validation on the dropdown list options break:
<http://ukweddinggroup.com/default.aspx?prd=249>
And still others completely wipe out with "System.ArgumentException: An
entry with the same key already exists":
<http://ukweddinggroup.com/default.aspx?prd=420>
The drop down list controls are created dynamically depending on what
options are available for each product in the database.
I'm presuming that there is a bug somewhere that was forgiven by .NET
1.1 but has now cropped up in .NET 2.0
The code that the runtime error objects to is:
System.ArgumentException: An entry with the same key already exists.
------------------------------------------------------
@ <span id="itemPriceIndicator"><%= this.ItemPrice.ToString("c")
%></span></strong></span>
------------------------------------------------------
ItemPrice is from an overridden page control used across the site:
------------------------------------------------------
public decimal ItemPrice
{
get
{
object o = ViewState["ItemPrice"];
if(o == null)
{
return 0.0M;
}
return (decimal)o;
}
set
{
ViewState["ItemPrice"] = value;
}
}
------------------------------------------------------
The code where I think something is going wrong is:
------------------------------------------------------
private void rptProductOptions_ItemCreated(object sender,
RepeaterItemEventArgs e)
{
if(e.Item != null && (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem))
{
PlaceHolder plh = (PlaceHolder)e.Item.FindControl("plhControl");
DataSet dsProductOptionData = this.ProductOptionData();
DataRow drOptionGroup =
dsProductOptionData.Tables["OptionGroup"].Rows[e.Item.ItemIndex];
DataView dvOptions = new DataView(
dsProductOptionData.Tables["Option"],
String.Format("OptionGroupID = {0}", drOptionGroup["ID"]),
"Incidence",
DataViewRowState.OriginalRows);
// JS price array
foreach(DataRowView drv in dvOptions)
{
RegisterArrayDeclaration("aPrice", drv["Price"].ToString());
}
bool mandatory = Convert.ToBoolean(drOptionGroup["Mandatory"]);
HYL.Cart.OptionGroupType type =
(HYL.Cart.OptionGroupType)Enum.Parse(typeof(HYL.Cart.OptionGroupType),
drOptionGroup["Type"].ToString());
RequiredFieldValidator rfv;
if(type == OptionGroupType.List || type ==
OptionGroupType.MultipleList)
{
#region Lists
// display checkbox as only 1 option
if(dvOptions.Count == 1)
{
CheckBox cbx = new CheckBox();
if(mandatory)
{
cbx.Checked = true;
cbx.Enabled = false;
this.ItemPrice += Convert.ToDecimal(dvOptions[0]["Price"]);
}
else
{
cbx.Attributes.Add("onclick", "UpdatePrice();");
}
cbx.Text = dvOptions[0]["Description"].ToString();
cbx.CssClass = "ProductOption";
plh.Controls.Add(cbx);
}
else if(dvOptions.Count > 1) // display drop down list/listbox
{
if(type == HYL.Cart.OptionGroupType.MultipleList)
{
ListBox lbx = new ListBox();
lbx.Attributes.Add("onchange", "UpdatePrice();");
lbx.CssClass = "ProductOption";
lbx.Rows = 5;
lbx.SelectionMode = ListSelectionMode.Multiple;
lbx.DataTextField = "Description";
lbx.DataValueField = "ID";
lbx.DataSource = dvOptions;
lbx.DataBind();
plh.Controls.Add(lbx);
// to add client id after everything has finished databinding
lbx.PreRender += new EventHandler(lbx_PreRender);
if(mandatory)
{
rfv = new RequiredFieldValidator();
rfv.CssClass = "errText";
rfv.Display = ValidatorDisplay.Dynamic;
rfv.Text = "Please select an option.<br>";
rfv.ControlToValidate = lbx.ClientID;
plh.Controls.AddAt(0, rfv);
}
}
else
{
DropDownList ddl = new DropDownList();
ddl.Attributes.Add("onchange", "UpdatePrice();");
ddl.CssClass = "ProductOption";
ddl.DataTextField = "Description";
ddl.DataValueField = "ID";
ddl.DataSource = dvOptions;
ddl.DataBind();
plh.Controls.Add(ddl);
// to add blank option and client id after everything has
finished databinding
ddl.PreRender += new EventHandler(ddl_PreRender);
if(mandatory)
{
rfv = new RequiredFieldValidator();
rfv.CssClass = "errText";
rfv.Display = ValidatorDisplay.Dynamic;
rfv.Text = "Please select an option.<br>";
rfv.ControlToValidate = ddl.ClientID;
rfv.InitialValue = "0";
plh.Controls.AddAt(0, rfv);
}
}
}
#endregion
}
else if(type == OptionGroupType.IntegerInput || type ==
OptionGroupType.StringInput)
{
#region TextBoxes
TextBox txt = new TextBox();
if(type == OptionGroupType.IntegerInput)
{
txt.CssClass = "txtFieldSm";
}
else
{
txt.CssClass = "txtField";
txt.TextMode = TextBoxMode.MultiLine;
}
plh.Controls.Add(txt);
txt.PreRender += new EventHandler(txt_PreRender);
if(mandatory)
{
if(type == OptionGroupType.IntegerInput)
{
CompareValidator cmpv = new CompareValidator();
cmpv.CssClass = "errText";
cmpv.Display = ValidatorDisplay.Dynamic;
cmpv.Text = "Please enter a valid number.<br>";
cmpv.Type = ValidationDataType.Integer;
cmpv.Operator = ValidationCompareOperator.DataTypeCheck;
cmpv.ControlToValidate = txt.ClientID;
plh.Controls.AddAt(0, cmpv);
}
else
{
rfv = new RequiredFieldValidator();
rfv.CssClass = "errText";
rfv.Display = ValidatorDisplay.Dynamic;
rfv.Text = "Please enter a value.<br>";
rfv.ControlToValidate = txt.ClientID;
plh.Controls.AddAt(0, rfv);
}
}
#endregion
}
else if(type == OptionGroupType.DateInput)
{
#region Date Drop Downs
HYL.Web.Controls.DateDropDown ddd = new
HYL.Web.Controls.DateDropDown();
ddd.DateValue = DateTime.Today;
ddd.CalendarLinkText = "<img class=\"icoCalendar\" alt=\"calendar
select\" src=\"img/ico_calendar.gif\">";
ddd.CalendarPosition = 3;
ddd.CalendarStylePath = "@import 'Page/pfcal.css';";
ddd.DisplayFormat = "dMMMMyyyy";
ddd.ShowCalendar = true;
ddd.CssClass = "dateDropDown";
ddd.YearUpperBound = 3;
plh.Controls.Add(ddd);
ddd.PreRender += new EventHandler(ddd_PreRender);
if(mandatory)
{
DateTime minDate = DateTime.Today.AddDays(7);
ddd.DisabledDates = new HYL.Web.Controls.SelectionRange[] { new
HYL.Web.Controls.SelectionRange(DateTime.MinValue, minDate) };
ddd.DateValue = minDate;
HYL.Web.Controls.DateDropDownCompareValidator dcv = new
HYL.Web.Controls.DateDropDownCompareValidator();
dcv.CssClass = "errText";
dcv.Display = ValidatorDisplay.Dynamic;
dcv.Text = "Please enter a date at least 1 week from
today.<br>";
dcv.DateToCompare = minDate;
dcv.Operator = ValidationCompareOperator.GreaterThanEqual;
dcv.ControlToValidate = ddd.ClientID;
plh.Controls.AddAt(0, dcv);
}
#endregion
}
else if(type == OptionGroupType.None)
{
// do nothing
}
}
}
------------------------------------------------------
Anyone got an bright ideas?
Cheers
bne