This is a migrated thread and some comments may be shown as answers.

UpdatePanel make Radgrid disappear when postback

1 Answer 387 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Peter
Top achievements
Rank 1
Peter asked on 09 Jan 2019, 09:12 AM
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 , 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 order of locations and indicators
                // order numbers will be for sorting in 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;
                }
            }
        }

1 Answer, 1 is accepted

Sort by
0
Eyup
Telerik team
answered on 14 Jan 2019, 08:54 AM
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.
Tags
Grid
Asked by
Peter
Top achievements
Rank 1
Answers by
Eyup
Telerik team
Share this question
or