I am having problems with setting the selected value of a RadCombobox that loads items on demand.
I have a RadComboBox as a templated item within a RadGrid and the page I have is geared towards batch updates in a Radgrid and based on this example: http://demos.telerik.com/aspnet-ajax/grid/examples/dataediting/clienteditbatchupdates/defaultcs.aspx, except for some very important differences in the type of drop down used which may be contributing to the issues.
Unlike the example, I use a RadCombobox that loads items on demand instead of a regular dropdown and I want to bind the RadCombobox to a nullable item. I am unable to bind the SelectedValue property of the RadComboBox to the value I want, AccountID, using a simple Bind("AccountID") statement because the value can (and often is) null (which is valid in my scenario).
When I double click a row to put it in "edit mode", e.g. display the Radcombobox and hide the Label, no items are loaded into the combobox until I click on it (due to the load on demand). I have been unable to get the RadCombobox to have it's selected value initially set to a SelectedValue because of this and I wondering what I am doing wrong/missing.
I can tell that cb.SelectedValue is being set to the correct value in the RadGrid's ItemDatabound event, but at that time there are 0 items loaded into a RadCombobox for a particular row. I have also tried commenting out ClearSelection in the item load in the RadCombobox's ItemsRequested method, but that has no effect.
One thing I thought is that, since lblAccountID also contains the value I would want to bind/select in the RadCombobox there could be a JavaScript solution to this, where after the items are loaded on demand, the corresponding lblAccountID label for the particular row could be checked and used to set the selected value in the cboAccountID in a delayed manner.
Code-behind:
I have a RadComboBox as a templated item within a RadGrid and the page I have is geared towards batch updates in a Radgrid and based on this example: http://demos.telerik.com/aspnet-ajax/grid/examples/dataediting/clienteditbatchupdates/defaultcs.aspx, except for some very important differences in the type of drop down used which may be contributing to the issues.
Unlike the example, I use a RadCombobox that loads items on demand instead of a regular dropdown and I want to bind the RadCombobox to a nullable item. I am unable to bind the SelectedValue property of the RadComboBox to the value I want, AccountID, using a simple Bind("AccountID") statement because the value can (and often is) null (which is valid in my scenario).
When I double click a row to put it in "edit mode", e.g. display the Radcombobox and hide the Label, no items are loaded into the combobox until I click on it (due to the load on demand). I have been unable to get the RadCombobox to have it's selected value initially set to a SelectedValue because of this and I wondering what I am doing wrong/missing.
I can tell that cb.SelectedValue is being set to the correct value in the RadGrid's ItemDatabound event, but at that time there are 0 items loaded into a RadCombobox for a particular row. I have also tried commenting out ClearSelection in the item load in the RadCombobox's ItemsRequested method, but that has no effect.
One thing I thought is that, since lblAccountID also contains the value I would want to bind/select in the RadCombobox there could be a JavaScript solution to this, where after the items are loaded on demand, the corresponding lblAccountID label for the particular row could be checked and used to set the selected value in the cboAccountID in a delayed manner.
<telerik:GridTemplateColumn UniqueName="AccountID" SortExpression="AccountID" HeaderText="Account" ConvertEmptyStringToNull="true"> |
<ItemTemplate> |
<asp:Label ID="lblAccountID" runat="server" Text='<%# Eval("AccountID") %>' Width="305px" /> |
<telerik:radcombobox id="cboAccountID" runat="server" |
Width="305px" Height="200px" |
EnableVirtualScrolling="true" |
HighlightTemplatedItems="true" |
EnableLoadOnDemand="true" |
DataValueField="AccountID" |
OnItemsRequested="cboAccountID_ItemsRequested" |
Style="display: none" |
EmptyMessage="Select a Account" > |
<CollapseAnimation Type="OutQuint" Duration="200"></CollapseAnimation> |
<HeaderTemplate> |
<table style="width: 275px" cellspacing="0" cellpadding="0"> |
<tr> |
<td style="width: 20%;"> |
AccountID</td> |
<td style="width: 80%"> |
Account Alias and ControlSrc</td> |
<td style="width: 20%"> |
Is Active?</td> |
</tr> |
</table> |
</HeaderTemplate> |
<ItemTemplate> |
<table style="width: 275px" cellspacing="0" cellpadding="0"> |
<tr> |
<td style="width: 20%;"> |
<%#DataBinder.Eval(Container, "Attributes['AccountID']")%> |
</td> |
<td style="width: 80%;"> |
<%#DataBinder.Eval(Container, "Attributes['AccountAliasAndControlSrc']")%> |
</td> |
<td style="width: 20%;"> |
<%# DataBinder.Eval(Container, "Attributes['IsActive']")%> |
</td> |
</tr> |
</table> |
</ItemTemplate> |
</telerik:radcombobox> |
</ItemTemplate> |
</telerik:GridTemplateColumn> |
Code-behind:
Protected Sub RadGrid1_ItemDataBound(ByVal sender As Object, ByVal e As Telerik.Web.UI.GridItemEventArgs) Handles RadGrid1.ItemDataBound |
Dim cbo As RadComboBox = e.Item.FindControl("cboAccountID") |
If Not cbo Is Nothing Then |
If Not DataBinder.Eval(e.Item.DataItem, "AccountID") Is Nothing And IsDBNull(DataBinder.Eval(e.Item.DataItem, "AccountID")) = False Then |
Try |
cbo.SelectedValue = DataBinder.Eval(e.Item.DataItem, "AccountID").ToString |
Catch ex As ArgumentOutOfRangeException |
Catch ex As Exception |
End Try |
End If |
End If |
Dim lbl As Label = e.Item.FindControl("lblAccountID") |
If Not lbl Is Nothing Then |
If Not DataBinder.Eval(e.Item.DataItem, "AccountID") Is Nothing And IsDBNull(DataBinder.Eval(e.Item.DataItem, "AccountID")) = False Then |
If Not String.IsNullOrEmpty(lbl.Text) Then |
Me.ToolTipManager.TargetControls.Add(lbl.ClientID, DataBinder.Eval(e.Item.DataItem, "AccountID").ToString, True) |
End If |
End If |
End If |
End Sub |
Protected Sub cboAccountID_ItemsRequested(ByVal sender As Object, ByVal e As RadComboBoxItemsRequestedEventArgs) |
Dim reader As SqlDataReader = SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString, _ |
Data.CommandType.StoredProcedure, "proc_ConfigAccounts_GetAllAccounts") |
Dim comboBox As RadComboBox = DirectCast(sender, RadComboBox) |
comboBox.Items.Clear() |
comboBox.ClearSelection() |
While reader.Read |
Dim item As New RadComboBoxItem() |
item.Text = reader("AccountID").ToString & " | " & reader("AccountAliasAndControlSrc") & " | " & reader("IsActive").ToString |
item.Value = reader("AccountID") |
Dim AccountAliasAndControlSrc As String = reader("AccountAliasAndControlSrc") |
Dim isActive As Boolean = reader("IsActive") |
item.Attributes.Add("AccountID", reader("AccountID").ToString) |
item.Attributes.Add("AccountAliasAndControlSrc", AccountAliasAndControlSrc.ToString()) |
item.Attributes.Add("IsActive", isActive.ToString()) |
comboBox.Items.Add(item) |
item.DataBind() |
End While |
reader.Close() |
' ''Add default list item |
''Dim DefaultItem As New RadComboBoxItem() |
''DefaultItem.Text = TryCast(GetGlobalResourceObject("CommonTerms", "EmptyDropdownItem"), String) |
''DefaultItem.Value = String.Empty |
''comboBox.Items.Insert(0, DefaultItem) |
End Sub |