I have a custom validator attached to a date column in edit on an order entry system to insure that the user doesn't change the date to one already on another order item for that product
if the error is triggered in Firefox (but not in IE, Opera, Safari or Chrome) the date stops popping up for any other item on the page
the column from the grid
some Javascript
decorate the edit item
am I going about it the wrong way - or is there - gasp! - a bug?
I'm using the Q3 2011 version
if the error is triggered in Firefox (but not in IE, Opera, Safari or Chrome) the date stops popping up for any other item on the page
the column from the grid
<telerik:GridDateTimeColumn UniqueName="ShipDate" DataField="ShipDate" PickerType="DatePicker" HeaderText="Ship Date" DataFormatString="{0:d}" DataType="System.DateTime" > <HeaderStyle Width="60px" /> </telerik:GridDateTimeColumn> var j = 0; function ship_date_selected(sender, eventArgs) { var date = eventArgs._newValue; // prevent loop// var chk = eventArgs._oldValue; if (j > 0) { return; } var oldDate = eventArgs.get_oldDate(); var thisItem = document.getElementById('txtItemID'); // date already for Item var theGrid = $find("<%=rgEditOrder.ClientID %>").get_masterTableView(); var j = $find("<%=rgEditOrder.ClientID %>")._editIndexes[0]; var editRow = theGrid.get_dataItems()[j]; var thisStore = theGrid.getCellByColumnUniqueName(editRow, "StoreNumber").innerHTML; for (var i = 0; i < theGrid.get_dataItems().length; i++) { var row = theGrid.get_dataItems()[i]; if (!row.get_isInEditMode()) { var ItemID = theGrid.getCellByColumnUniqueName(row, "ItemID").innerHTML; var storeNumber = theGrid.getCellByColumnUniqueName(row, "StoreNumber").innerHTML;// alert(ItemID); if (parseInt(ItemID) == parseInt(thisItem.value)) { if (parseInt(storeNumber) == parseInt(thisStore)) { var ShipDate = theGrid.getCellByColumnUniqueName(row, "ShipDate").innerHTML;// alert(ShipDate); if (Date.parse(date) == Date.parse(ShipDate)) { alert('Date already used ' + ShipDate); sender.set_selectedDate(oldDate); i = 9999; return false; } } } } } var strSD = format_dates(date); if (!delivery_ok(strSD)) { j++; sender.set_selectedDate(oldDate); alert('Invalid delivery date'); return false; } } // validate that date supplied falls in one of three ship windows function delivery_ok(strSD) { var endDate1 = document.getElementById('rtbEnd1'); var endDate2 = document.getElementById('rtbEnd2'); var endDate3 = document.getElementById('rtbEnd3'); var startDate1 = document.getElementById('rtbStart1'); var startDate2 = document.getElementById('rtbStart2'); var startDate3 = document.getElementById('rtbStart3'); // add century(20) to ship dates-mm/dd/yy->mm/dd/yyyy var vDate1 = format_dates(startDate1.value); var vDate2 = format_dates(startDate2.value); var vDate3 = format_dates(startDate3.value); var vEnd1 = format_dates(endDate1.value); var vEnd2 = format_dates(endDate2.value); var vEnd3 = format_dates(endDate3.value); if (vDate1 != '') { if (Date.parse(strSD) >= Date.parse(vDate1) && Date.parse(strSD) <= Date.parse(vEnd1)) { return true; } } if (vDate2 != '') { if (Date.parse(strSD) >= Date.parse(vDate2) && Date.parse(strSD) <= Date.parse(vEnd2)) { return true; } } if (vDate3 != '') { if (Date.parse(strSD) >= Date.parse(vDate3) && Date.parse(strSD) <= Date.parse(vEnd3)) { return true; } } return false; } // append century(20) to date-mm/dd/yy->mm/dd/yyyy // validate that date is in correct format-if error found // return blank string function format_dates(strDate) { var i = 0; var arrDate; // this routine makes no sense for (i = 0; i < 3; i++) { if (strDate.indexOf("/") != -1) { arrDate = strDate.split("/"); if (arrDate.length != 3) { return ""; } } else { return ""; } } // prefix the year with century-hardcoded 20 var ye = "20" + arrDate[2].substring(arrDate[2].length - 2); var month = Number(arrDate[0]); var day = Number(arrDate[1]) // check month and day-month between 1 and 12,day between 1 and 31 // except April,June,September and November-and February if (month < 1 || month > 12) { return ""; } if (day < 1 || day > 31) { return ""; } if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) { return ""; } // February-check against leap year if (month == 2) { var isleap = (ye % 4 == 0 && (ye % 100 != 0 || ye % 400 == 0)); if (day > 29 || (day == 29 && !isleap)) { return ""; } } // no date errors encountered-rebuild date and return var strD = Number(arrDate[0]) + "/" + Number(arrDate[1]) + "/" + ye; return strD; }decorate the edit item
protected void rgEditOrder_ItemCreated(object source, GridItemEventArgs e) { GridEditableItem geItem;// GridDataItem gdItem; RadDatePicker rdpShipDate; GridDateTimeColumnEditor ceShipDate; TableCell tcShipDate; CustomValidator cvShipDate; RadNumericTextBox rntbQty;// int MinQty; if (e.Item.IsInEditMode) { } else return; if (e.Item is GridEditableItem) { } else return; geItem = (GridEditableItem)e.Item; rdpShipDate = (geItem["ShipDate"].Controls[0] as RadDatePicker); rdpShipDate.ClientEvents.OnDateSelected = "ship_date_selected"; rdpShipDate.AutoPostBack = true; rdpShipDate.SelectedDateChanged += rdpShipDate_SelectedDateChanged; txtShipDate.Value = rdpShipDate.ClientID; ceShipDate = geItem.EditManager.GetColumnEditor("ShipDate") as GridDateTimeColumnEditor; tcShipDate = (TableCell)ceShipDate.PickerControl.Parent; cvShipDate = new CustomValidator(); cvShipDate.ID = "cvShipDate"; cvShipDate.ControlToValidate = rdpShipDate.ID; cvShipDate.ServerValidate += ShipDate_OnServerValidate; cvShipDate.Text = "*"; cvShipDate.ErrorMessage = "Item already ordered on this ship date"; tcShipDate.Controls.Add(cvShipDate); }am I going about it the wrong way - or is there - gasp! - a bug?
I'm using the Q3 2011 version