RadCombobox With Load On Demand In RadGrid Not Obtaining Selected Value

2 posts, 0 answers
  1. jgill
    jgill avatar
    116 posts
    Member since:
    Jul 2005

    Posted 19 Jun 2010 Link to this post

    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.


                <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 ObjectByVal 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 ObjectByVal 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 

  2. Simon
    Admin
    Simon avatar
    2281 posts

    Posted 23 Jun 2010 Link to this post

    Hi jgill,

    The solution you have suggested is exactly the right one for this case.

    You could handle the client-side ItemsRequested event of the RadComboBox and assuming that you have AccountID value previously selected for this row you could do the following:
    function onItemsRequested(sender) {
        var itemToSelect = sender.findItemByValue(accountId);
        if (itemToSelect)
            itemToSelect.select();
    }

    All the best,
    Simon
    the Telerik team
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
Back to Top