UpdatePanel make Radgrid disappear when postback

2 posts, 0 answers
  1. Peter
    Peter avatar
    13 posts
    Member since:
    Sep 2018

    Posted 09 Jan Link to this post

    I have added UpdatePanel to include a grid in order to reflect some changes. However, when I click other buttons on the page to update some data and the grid will disappear after postback. 

    I try to remove the UpdatePanel, then the grid will be shown and data will be shown on the grid. 

    Here is my code. 

    Mainly, when the page first comes in, the grid will be shown with data. However, when I click a button on the page to update some data, and the update should be shown on the grid. The page is a postback, however, when I do this, the grid will not be shown. 

    I try to remove the UpdatePanel in aspx, then when I click the button on the page to update data, the grid will be shown again. It seems the UpdatePanel has made the grid disappear. I need to keep the UpdatePanel and make the grid not disappeared after I click the button on the page and post back.

            <asp:UpdatePanel ID="UpdatePanel3" runat="server">
           <ContentTemplate>
              <telerik:RadGrid ID="uiGrid" runat="server"
                 AutoGenerateColumns="false" ItemStyle-BackColor="White" AlternatingItemStyle-BackColor="White"
                 OnDataBound="uiGrid_DataBound" OnItemDataBound="uiGrid_ItemDataBound" OnNeedDataSource="uiGrid_NeedDataSource"
                 ClientSettings-ClientEvents-OnKeyPress="keyPressInGrid"
                 Width="100%" Height="500" EnableViewState="true">
                 <ClientSettings>
                    <Scrolling CountGroupSplitterColumnAsFrozen="false" AllowScroll="true" UseStaticHeaders="True" SaveScrollPosition="true" FrozenColumnsCount="3"></Scrolling>
                 </ClientSettings>
                 <MasterTableView>
                    <GroupByExpressions>
                       <telerik:GridGroupByExpression>
                          <SelectFields>
                             <telerik:GridGroupByField FieldAlias="<%$ Resources:Resource,Group %>" FieldName="IndicatorParentName"></telerik:GridGroupByField>
                          </SelectFields>
                          <GroupByFields>
                             <telerik:GridGroupByField FieldName="IndicatorParentName" SortOrder="Ascending"></telerik:GridGroupByField>
                          </GroupByFields>
                       </telerik:GridGroupByExpression>
                    </GroupByExpressions>
                    <Columns>
                       <telerik:GridBoundColumn DataField="IndicatorName" HeaderText="<%$ Resources:Resource,Indicator %>" UniqueName="IndicatorName"
                          SortExpression="IndicatorName" DataType="System.String" ItemStyle-Wrap="false">
                       </telerik:GridBoundColumn>
                       <telerik:GridTemplateColumn>
                          <ItemTemplate>
                             <asp:HiddenField ID="uiIndicatorID" runat="server" Value='<%#Eval("IndicatorID")%>' />
                             <asp:HiddenField ID="uiIndicatorName" runat="server" Value='<%#Eval("IndicatorName")%>' />
                             <asp:ImageButton ID="uiTipsButton" runat="server" ImageUrl="images/information-icon.png?20170703" Width="16" Height="16" />
                          </ItemTemplate>
                       </telerik:GridTemplateColumn>
                       <telerik:GridTemplateColumn HeaderText="<%$ Resources:Resource,Unit %>">
                          <ItemTemplate>
                             <asp:Label ID="uiUnit" runat="server" />
                          </ItemTemplate>
                       </telerik:GridTemplateColumn>
                    </Columns>
                 </MasterTableView>
              </telerik:RadGrid>
           </ContentTemplate>
        </asp:UpdatePanel>

    And here is the code behind :

        protected void uiImport_Click(object sender, EventArgs e)
            {
                // clear message
                uiErrorMsg.Text = "";
                uiSuccessMsg2.Text = "";

                StringBuilder message = new StringBuilder(1024);

                HttpResponseMessage result = null;

                if (uiUpload.UploadedFiles.Count > 0)
                {
                    result = ImportData();

                    if (result.IsSuccessStatusCode)
                    {
                        message.Append(Convert.ToString(HttpContext.GetGlobalResourceObject("Resource", "Message_Import_Data_Successful")));
                        message.Append(Environment.NewLine);
                        try
                        {
                            _usageData.Dispose();
                            _usageData = null;
                        }
                        catch { }
                        
                        BindGrid(true); // refresh grid.

                        // update task modified by and date
                        bool hasError = false;
                        Common.Systems.Sustainability.Constants.ApprovalStatuses status = Common.Systems.Sustainability.Constants.ApprovalStatuses.Undefined;
                        bool isApprovedOrRejected = WorkflowUtil.IsApprovedOrRejected(_taskID.Value, ref status);
                        if (isApprovedOrRejected)
                        {
                            // re-cache data for dashboards
                            int companyID = Common.WebUtil.GetCompanyID();
                            Thread childThread = new Thread(() => Util.ReCacheForDashboards(Cache, companyID));
                            childThread.Start();
                        }
                        else
                        {
                            UpdateTask(ref hasError);
                        }
                    }
                    else
                    {
                        string msg = Convert.ToString(HttpContext.GetGlobalResourceObject("Resource", "Message_Unable_To_Import_Data"));
                        message.Append(msg);
                        message.Append(Environment.NewLine);

                        string resultMessage = result.Content.ReadAsStringAsync().Result;
                        if (resultMessage.IndexOf("ExceptionMessage", StringComparison.OrdinalIgnoreCase) > -1)
                        {
                            resultMessage = resultMessage.Replace("\\r\\n", "<br />");
                            Logger.Log(string.Format("Error occurs in the '{0}.{1}' method.{2}{3}"
                                , System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString()
                                , System.Reflection.MethodBase.GetCurrentMethod().Name
                                , Environment.NewLine
                                , resultMessage));
                        }
                        else
                        {
                            message.Append(Common.Util.ReformatMessage(resultMessage));
                        }
                    } // end if
                } // end if

                if (result != null)
                {
                    if (result.IsSuccessStatusCode)
                    {
                        uiSuccessMsg2.Text = message.Replace(Environment.NewLine, "<br />").ToString();
                    }
                    else
                    {
                        // show error message on web.
                        //uiErrorMsg.Text = message.Replace(Environment.NewLine, "<br />").ToString();
                        //uiPanel2.Alert(message.ToString());
                        uiReportPanel.Alert(message.ToString());
                    } // end if
                } // end if
            }


        private void BindGrid(bool performDataBind = true)
            {
                DataTable locationsTable = null;
                DataTable indicatorsTable = null;
                try
                {
                    // try to get delegation, location and indicators information, it contains sequence order of locations and indicators
                    // order numbers will be using for sorting in code below
                    try
                    {
                        _delegation = GetDelegationByTaskID(_taskID.Value);
                        int delegationID = Convert.ToInt32(_delegation.Tables[0].Rows[0][Common.Systems.Sustainability.Constants.Delegation.ID]);
                        _delegationLocationsAndIndicators = GetDelegationLocationsAndIndicatorsByDelegationID(delegationID);
                    }
                    catch { }

                    // remove all columns
                    for (int i = 3; i < uiGrid.MasterTableView.Columns.Count; i++)
                    {
                        GridColumn col = uiGrid.MasterTableView.Columns[i];
                        uiGrid.MasterTableView.Columns.Remove(col);
                        i--;
                    }

                    DataSet usage = GetUsageData();
                    //using (DataSet usage = GetUsageData())
                    //{
                    
                    {
                        locationsTable = usage.Tables[0].DefaultView.ToTable(true, new string[] {
                                Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.LocationID
                                , Common.Systems.Sustainability.Constants.Location.LocationName
                            }
                        );

                        // As requested by user in 2016-07, sorting location and indicator based on delegation selected ordering.
                        if (_delegationLocationsAndIndicators != null)
                        {
                            locationsTable.Columns.Add(Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForLocation, Type.GetType("System.Int32"));
                            foreach (DataRow dr in locationsTable.Rows)
                            {
                                DataRow[] dli = _delegationLocationsAndIndicators.Tables[0].Select(string.Format("{0} = {1}"
                                            , Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.LocationID
                                            , dr[ .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.LocationID]
                                        ));
                                if (dli.Length > 0)
                                {
                                    int? sequence =  .Common.Util.TryToConvertToInt32(dli[0],  .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForLocation);
                                    if (sequence != null)
                                    {
                                        dr[ .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForLocation] = sequence.Value;
                                    }
                                }
                            }

                            locationsTable.DefaultView.Sort =  .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForLocation;
                            DataTable temp = locationsTable.DefaultView.ToTable();
                            locationsTable.Dispose();
                            locationsTable = temp;
                        }


                        // append locations to grid view
                        int i = 0;
                        foreach (DataRow dr in locationsTable.Rows)
                        {
                            string locationID = Convert.ToString(dr["LocationID"]);
                            string locationName = Convert.ToString(dr["LocationName"]);

                            GridTemplateColumn tplColumn = new GridTemplateColumn();
                            tplColumn.ItemTemplate = new UsageColumnTemplate(locationName, i.ToString(), locationID, _currencies);
                            tplColumn.HeaderText = locationName;
                            uiGrid.MasterTableView.Columns.Add(tplColumn);

                            i++;
                        }

                        
                    }


                    // filter out indicators if no location associated
                    {
                        indicatorsTable = usage.Tables[0].DefaultView.ToTable(true, new string[] {
                                 .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.IndicatorID
                                ,  .Common.Systems.Sustainability.Constants.Indicator.IndicatorName
                                , "IndicatorParentName" // Added by HC on 2016-06-08, as requested by users, use parent indicator name as group on the grid view.
                            }
                        );

                        // As requested by user in 2016-07, sorting location and indicator based on delegation selected ordering.
                        if (_delegationLocationsAndIndicators != null)
                        {
                            indicatorsTable.Columns.Add( .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForIndicator, Type.GetType("System.Int32"));
                            foreach (DataRow dr in indicatorsTable.Rows)
                            {
                                DataRow[] dli = _delegationLocationsAndIndicators.Tables[0].Select(string.Format("{0} = {1}"
                                            ,  .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.IndicatorID
                                            , dr[ .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.IndicatorID]
                                        ));
                                if (dli.Length > 0)
                                {
                                    int? sequence =  .Common.Util.TryToConvertToInt32(dli[0],  .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForIndicator);
                                    if (sequence != null)
                                    {
                                        dr[ .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForIndicator] = sequence.Value;
                                    }
                                }
                            }

                            indicatorsTable.DefaultView.Sort =  .Common.Systems.Sustainability.Constants.DelegationLocationAndIndicator.SequenceForIndicator;
                            DataTable temp = indicatorsTable.DefaultView.ToTable();
                            indicatorsTable.Dispose();
                            indicatorsTable = temp;
                        }

                        // bind indicators to grid view
                        uiGrid.DataSource = indicatorsTable;
                        //if (performDataBind)
                        //uiGrid.Rebind();
                    }
                        
                    //} // end using
                }
                finally
                {
                    if (locationsTable != null)
                    {
                        locationsTable.Dispose();
                        locationsTable = null;
                    }
                    if (indicatorsTable != null)
                    {
                        indicatorsTable.Dispose();
                        indicatorsTable = null;
                    }
                }
            }
  2. Eyup
    Admin
    Eyup avatar
    3756 posts

    Posted 14 Jan Link to this post

    Hello Peter,

    Here are some suggestions to resolve this issue:

    1. Template columns can be created programmatically only during Page_Init. Also, the entire grid should be defined during Page_Init:
    https://docs.telerik.com/devtools/aspnet-ajax/controls/grid/defining-structure/creating-a-radgrid-programmatically#creating-template-columns-programmatically

    2. Remove any logic from NeedDataSource event handler which is not related to the DataSource property:
    https://www.telerik.com/support/kb/aspnet-ajax/grid/details/how-to-bind-radgrid-properly-on-server-side

    3. Try replacing the UpdatePanel with RadAjaxPanel

    4. Check for any hidden script errors:
    https://www.telerik.com/support/kb/aspnet-ajax/ajaxmanager/details/get-more-descriptive-errors-by-disabling-ajax

    I hope this will prove helpful.

    Regards,
    Eyup
    Progress Telerik
    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Back to Top