
The markup added would ideally be
<img src="/sites/sitename/Style%20Library/en-us/Images/icon_pdf.gif" alt="PDF Icon" title="PDF Icon" /><a href="/sites/sitename/SiteCollectionDocuments/somedocument.pdf" title="somedocument.pdf">somedocument.pdf</a> (32kb)Hi,
I need a datepicker for when i edit a datetime field in my grid. It should only be possible to choose Month and Year. So from http://www.telerik.com/community/code-library/aspnet-ajax/calendar/month-year-picker.aspx I downloaded this. It works fine as is but i've placed the datepicker into my edittemplate and now i'm getting an error on the line of Javascript
--- var picker = $find("<%= RadDatePicker1.ClientID %>");
I'm guessing because my RadDatePicker1 is buried in the edittemplate. Is there a better way to use the DatePicker so i have Month/Year only or is this a good approach? If so how to reference the control?
For interest here's my column
<telerik:GridTemplateColumn HeaderText="Period Start" DataType="System.DateTime">
<EditItemTemplate>
<telerik:RadDatePicker ID="RadDatePicker1" runat="server" Skin="Web20" Width="130px">
<DateInput DateFormat="MMMM yyyy" LabelCssClass="radLabelCss_Web20" Skin="Web20">
</DateInput>
<Calendar Skin="Web20">
<FastNavigationSettings TodayButtonCaption="current date" />
</Calendar>
</telerik:RadDatePicker>
</EditItemTemplate>
<ItemTemplate>
<%#Eval("StartMonth")%>
</ItemTemplate>
</telerik:GridTemplateColumn>
If you don't wanna download the datepicker from that link here is the code which provides the Month/Year only functionality:
<script type="text/javascript">
//override the onload event handler to change the picker after the page is loaded
window.onload = function() {
window.setTimeout(function() { SetCalendarTable(); }, 200)
}
function SetCalendarTable() {
var picker = $find("<%= RadDatePicker1.ClientID %>");
var calendar = picker.get_calendar();
var fastNavigation = calendar._getFastNavigation();
$clearHandlers(picker.get_popupButton());
$addHandler(picker.get_popupButton(), "click", function() {
//debugger;
var textbox = picker.get_textBox();
//adjust where to show the popup table
var x, y;
var adjustElement = textbox;
if (textbox.style.display == "none")
adjustElement = picker.get_popupImage();
var pos = picker.getElementPosition(adjustElement);
x = pos.x;
y = pos.y + adjustElement.offsetHeight;
var e = {
clientX: x,
clientY: y
};
//synchronize the input date if set with the picker one
var date = picker.get_selectedDate();
if (date) {
calendar.FocusedDate[0] = date.getFullYear();
calendar.FocusedDate[1] = date.getMonth() + 1;
}
$get(calendar._titleID).onclick(e);
});
fastNavigation.OnOK =
function() {
var date = new Date(fastNavigation.Year, fastNavigation.Month, 1);
picker.get_dateInput().SetDate(date);
fastNavigation.Popup.Hide();
}
fastNavigation.OnToday =
function() {
var date = new Date();
picker.get_dateInput().SetDate(date);
fastNavigation.Popup.Hide();
}
}
</script>
<telerik:RadComboBox runat="server" ID="cboCopyFromTariff" Width="250" OnClientSelectedIndexChanged="cboCopyFromTariff_ClientSelectedIndexChanged" />
<telerik:RadComboBox runat="server" ID="cboCopyFromVersion" Width="250" OnClientSelectedIndexChanged="cboCopyFromVersion_ClientSelectedIndexChanged" OnClientItemsRequested="cboCopyFromVersion_ClientItemsRequested"/>
<telerik:RadComboBox runat="server" ID="cboCopyFromTable" Width="250" OnClientItemsRequested="cboCopyFromTable_ClientItemsRequested" />
function cboCopyFromVersion_ClientItemsRequested(sender, eventArgs) {
var items = sender.get_items();
if (items.get_count() > 0)
items.getItem(0).select();
}
function cboCopyFromTable_ClientItemsRequested(sender, eventArgs) {
var items = sender.get_items();
if (items.get_count() > 0)
items.getItem(0).select();
}
And the server side code looks like this:
private void cboCopyFromVersion_ItemsRequested(object sender, RadComboBoxItemsRequestedEventArgs e)
{
int tariffId = 0;
int.TryParse(e.Text, out tariffId);
LoadCopyFromVersions(tariffId);
}
private void cboCopyFromTable_ItemsRequested(object sender, RadComboBoxItemsRequestedEventArgs e)
{
int tariffVersionId = 0;
int.TryParse(e.Text, out tariffVersionId);
LoadCopyFromTables(tariffVersionId);
}
private void LoadCopyFromVersions(int tariffId)
{
cboCopyFromVersion.Items.Clear();
if (tariffId > 0)
{
var versions =
from v in this.DataContext.TariffVersionSet
where v.Tariff.TariffId == tariffId
orderby v.StartDate descending
select v;
cboCopyFromVersion.Items.Clear();
cboCopyFromVersion.DataValueField = "TariffVersionId";
cboCopyFromVersion.DataTextField = "Description";
cboCopyFromVersion.DataSource = versions.ToList();
cboCopyFromVersion.DataBind();
//Default to the TariffVersion passed
if (cboCopyFromVersion.Items.Count > 0)
{
int TariffVersionId = this.TariffVersion.TariffVersionId;
if (cboCopyFromVersion.Items.FindItemByValue(TariffVersionId.ToString()) != null)
cboCopyFromVersion.SelectedValue = TariffVersionId.ToString();
else
cboCopyFromVersion.SelectedIndex = 0;
LoadCopyFromTables(int.Parse(cboCopyFromVersion.SelectedValue));
}
else
LoadCopyFromTables(0);
}
else
LoadCopyFromTables(0);
}
private void LoadCopyFromTables(int tariffVersionId)
{
cboCopyFromTable.Items.Clear();
if (tariffVersionId > 0)
{
var tables =
from tt in this.DataContext.TariffTableSet
where tt.TariffVersion.TariffVersionId == tariffVersionId
orderby tt.Description descending
select tt;
cboCopyFromTable.DataValueField = "TariffTableId";
cboCopyFromTable.DataTextField = "Description";
cboCopyFromTable.DataSource = tables.ToList();
cboCopyFromTable.DataBind();
//Default to the latest TariffVersion for the selected Tariff
if (cboCopyFromTable.Items.Count > 0)
cboCopyFromTable.SelectedIndex = 0;
}
}
The problem occurs in the Save button's click handler:
protected void btnSave_Click(object sender, EventArgs e)
{
EF.TariffTable table;
if (optCopyTable.Checked && cboCopyFromTable.SelectedIndex > -1)
table = CopyTariffTable(int.Parse(cboCopyFromTable.SelectedValue));
else
table = CreateEmptyTariffTable();
}
When a new item is selected in the first combo the second combo correctly displays the first item filtered by the first's selection. And the third combo correctly shows the first item correctly filtered by the second.
However in the Save button handler the SelectedValue of the third combo (cboCopyFromTable) does not match what is displayed as selected.
I have read similar forum posts for previous versions of RadCombo and they suggest using the "Value" property instead of "SelectedValue", but the ASP.NET AJAX version doesn't have this property.
The help file article ms-help://telerik.aspnetajax.radcontrols.2008.Q2/telerik.aspnetajax.radcombobox.2008.Q2/load-on-demand-additional-attributes.html suggests a way of linking two combos together but it depends on EnableLoadOnDemand to be true. This is not suitable for my solution as there are few items in each combo and I don't want the user to be able to type in the box.
Can anyone suggest how to fix this so that the server side code is aware of the changes made during the AJAX callbacks?
Many thanks,
Jason Steele