Hi,
I have created a combo box that has custom item template. Each item is visualized as a checkbox and the value is kept as a hidden field, also inside the item template. The purpose is to allow multiple items to be selected at once (don't ask why, it was a client requirement). Also, we should not do any postback to the sever on each selection, instead, when the server code first attempts to get the selected items, each item is looped and depending on the state of the checkbox, a collection of selected items is being assembled. So far, everything works as expected, but the only issue I am having is when I click on the label of a checkbox item, or on the page right after blurring the items list, a postback event occurs. I have set both the RadComboBoxand the checkboxes AutoPostBack to 'false'. Any idea where this postback comes from and a way to disable it?
Here is a quick code example:
Here is how I collect the items:
And here is the clientside function that I am attaching to the checkbox event:
and the js code:
I have created a combo box that has custom item template. Each item is visualized as a checkbox and the value is kept as a hidden field, also inside the item template. The purpose is to allow multiple items to be selected at once (don't ask why, it was a client requirement). Also, we should not do any postback to the sever on each selection, instead, when the server code first attempts to get the selected items, each item is looped and depending on the state of the checkbox, a collection of selected items is being assembled. So far, everything works as expected, but the only issue I am having is when I click on the label of a checkbox item, or on the page right after blurring the items list, a postback event occurs. I have set both the RadComboBoxand the checkboxes AutoPostBack to 'false'. Any idea where this postback comes from and a way to disable it?
Here is a quick code example:
<telerik:RadComboBox ID="RadComboBox" runat="server" AllowCustomText="false" AutoPostBack="false"> <ItemTemplate> <asp:CheckBox ID="CheckBox" runat="server" Text='<%# Eval(DataTextField ?? "Text") %>' AutoPostBack="false" ClientIDMode="Predictable" /> <asp:HiddenField ID="HiddenField" runat="server" Value='<%# Eval(DataValueField ?? "Value") %>' ClientIDMode="Predictable" /> <asp:HiddenField ID="CheckedHiddenField" runat="server" Value='False' ClientIDMode="Predictable" /> </ItemTemplate></telerik:RadComboBox>Here is how I collect the items:
private ICollection<RadComboBoxItem> GetItems() { return RadComboBox.Items.Aggregate( new List<RadComboBoxItem>(), (list, item) => { var checkBox = item.Controls.OfType<CheckBox>().First(); var hidden = item.Controls.OfType<HiddenField>().First(); var selectedHidden = item.Controls.OfType<HiddenField>().Last(); if (bool.Parse(selectedHidden.Value)) { list.Add(new RadComboBoxItem(checkBox.Text, hidden.Value) { Selected = true }); } return list; }); }And here is the clientside function that I am attaching to the checkbox event:
protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); RadComboBox.Items.ToList().ForEach(ProcessItem); } private void ProcessItem(RadComboBoxItem item) { var checkbox = item.Controls.OfType<CheckBox>().Single(); var hidden = item.Controls.OfType<HiddenField>().First(); var selectedHidden = item.Controls.OfType<HiddenField>().Last(); checkbox.InputAttributes["onchange"] = string.Format( "multiselectComboBoxItemClick('{0}', '{1}', '{2}', '{3}', '{4}');", RadComboBox.ClientID, checkbox.ClientID, hidden.ClientID, selectedHidden.ClientID, checkbox.Text); }function multiselectComboBoxItemClick(comboBoxID, checkBoxID, valueHiddenFieldID, stateHiddenFieldID, itemText) { var combo = $find(comboBoxID); var checkbox = document.getElementById(checkBoxID); var hidden = document.getElementById(valueHiddenFieldID); var selectedHidden = document.getElementById(stateHiddenFieldID); if (!combo || !checkbox || !hidden) { return; } if (!combo['__SelectedItems']) { combo['__SelectedItems'] = []; } if (!combo['__SelectedItemsMap']) { combo['__SelectedItemsMap'] = {}; } var value = hidden.value.toString(); if (checkbox.checked == true) { var item = combo['__SelectedItemsMap'][value]; if (!item) { item = new Telerik.Web.UI.RadComboBoxItem(); item.set_text(itemText); item.set_value(value); combo['__SelectedItemsMap'][value] = item; Array.add(combo['__SelectedItems'], item); } selectedHidden.value = 'True'; } else { var item = combo['__SelectedItemsMap'][value]; if (item) { var index = $telerik.$.inArray(item, combo['__SelectedItems']); if (index != -1) { combo['__SelectedItems'].splice(index, 1); combo['__SelectedItemsMap'][value] = null; } } selectedHidden.value = 'False'; } var text = ''; if (combo['__SelectedItems'].length > 0) { text = combo['__SelectedItems'][0].get_text(); for (var i = 1; i < combo['__SelectedItems'].length; i++) { text = text + ', ' + combo['__SelectedItems'][i].get_text(); } } combo.set_text(text);}