【问题标题】:ASP.NET C# Telerik RadGrid is null when using site master使用站点主服务器时,ASP.NET C# Telerik RadGrid 为空
【发布时间】:2023-03-10 06:35:02
【问题描述】:

我正在尝试将我当前的 Web 项目转换为使用站点管理员,而不是在每个单独的页面上都有我的导航和标题。

我在使用 site.master 的内容页面上定义了一个 RadGrid。如果我尝试启动该项目,它会在任何尝试访问 RadGrid 的属性时出错,并且“对象引用未设置为对象的实例”。

但是,如果我在不使用 site.master 的情况下启动项目,它将正常加载。页面后面的代码差异为零。唯一不同的是aspx前端页面使用了ContentReplacer。

这是我正在尝试做的一些小sn-ps:

MainContentReplacer 中的 RadGrid 定义:

                    <telerik:RadGrid runat="server" ID="RadGrid1" AllowPaging="True" PageSize="25" AllowSorting="true"
                    OnNeedDataSource="RadGrid1_NeedDataSource" OnItemDataBound="RadGrid1_ItemDataBound" AutoGenerateColumns="False"
                    AllowCustomPaging="true" PagerStyle-Mode="Advanced">
                    <ClientSettings Selecting-AllowRowSelect="True" EnablePostBackOnRowClick="true">
                    </ClientSettings>
                    <PagerStyle Mode="Slider" Position="TopAndBottom" PageSizeControlType="RadComboBox" AlwaysVisible="true"></PagerStyle>

                    <MasterTableView AllowFilteringByColumn="false" InsertItemPageIndexAction="ShowItemOnCurrentPage" CommandItemDisplay="Top" ShowHeader="true" Width="100%" DataKeyNames="ID, Location, Description, CurrentStatus, Priority, WorkOrderNumber, ReportDate, ReportedBy" AllowMultiColumnSorting="True">
                        <CommandItemSettings ShowAddNewRecordButton="false" ShowExportToCsvButton="false" ShowExportToExcelButton="false" ShowExportToPdfButton="false" ShowExportToWordButton="false" ShowRefreshButton="true" />
                        <Columns>
                            <telerik:GridBoundColumn DataField="ID" HeaderText="ID" DataType="System.Guid" FilterControlWidth="0px"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="Location" HeaderText="Location" DataType="System.String" FilterControlWidth="100px"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="Description" HeaderText="Description" DataType="System.String" FilterControlWidth="100px"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="CurrentStatus" HeaderText="Current Status" DataType="System.String" FilterControlWidth="100px"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="Priority" HeaderText="Priority" DataType="System.String" FilterControlWidth="100px"></telerik:GridBoundColumn>
                            <telerik:GridBoundColumn DataField="WorkOrderNumber" HeaderText="Work Order Number" DataType="System.String" FilterControlWidth="100px"></telerik:GridBoundColumn>
                            <telerik:GridDateTimeColumn DataField="ReportDate" HeaderText="Report Date" DataFormatString="{0:d}" DataType="System.DateTime" ShowFilterIcon="false" AutoPostBackOnFilter="true" FilterControlWidth="100px"></telerik:GridDateTimeColumn>
                            <telerik:GridBoundColumn DataField="ReportedBy" HeaderText="Reported By" DataType="System.String" FilterControlWidth="100px"></telerik:GridBoundColumn>
                        </Columns>
                    </MasterTableView>
                </telerik:RadGrid>

site.master:

<!DOCTYPE html>

<head runat="server">

    <telerik:RadCodeBlock ID="radCodeBlockHead" runat="server">

    <title><%=Page.Title%></title>

    <!-- // Sitewide Favicon -->
    <link rel="shortcut icon" type="image/x-icon" href="<%=Page.ResolveUrl("~")%>favicon.ico" />

    <!-- // Main Bootstrap CSS Stylesheet v3.3.4 //-->
    <link rel="stylesheet" type="text/css" href="<%=Page.ResolveUrl("~")%>includes/css/bootstrap.min.css" />   

    <!-- // Bootstrap Theme CSS Stylesheet v3.3.4 //-->
    <link rel="stylesheet" type="text/css" href="<%=Page.ResolveUrl("~")%>includes/css/bootstrap-theme.min.css" />

    <!-- // Main JQuery v1.11.2 //-->
    <script src="<%=Page.ResolveUrl("~")%>includes/js/jquery-1.11.2.min.js"></script>

    <!-- // Main Bootstrap JS v3.3.4 //-->
    <script src="<%=Page.ResolveUrl("~")%>includes/js/bootstrap.min.js"></script> 

    <!-- // Placeholder for page specific header content // -->
    <asp:ContentPlaceHolder ID="MainHeadContentReplacer" runat="server">
    </asp:ContentPlaceHolder>

</telerik:RadCodeBlock>

</head>

<body>
    <form id="form" runat="server">

    <!-- // General Telerik controls every page needs access to. // -->
    <telerik:RadScriptManager runat="server" ID="radScriptManager" />

    <div class="container-fluid">

        <telerik:RadCodeBlock ID="radCodeBlockNavigation" runat="server">

        <!-- // Main Navigation // -->
          <nav class="navbar navbar-default">
            <div class="container-fluid">
              <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                  <span class="sr-only">Toggle navigation</span>
                  <span class="icon-bar"></span>
                  <span class="icon-bar"></span>
                  <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#"><img src="<%=Page.ResolveUrl("~")%>includes/images/back.png" alt="Back" height="48" width="48" style="margin-top:-15px;" /></a>
              </div>
              <div id="navbar" class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                  <li class="active"><a href="#"><%=Page.Title%></a></li>
                </ul>
                <ul class="nav navbar-nav navbar-right">
                  <li><a href="#"><img src="<%=Page.ResolveUrl("~")%>includes/images/home.png" alt="Back" height="48" width="48" style="margin-top:-15px;" /></a></li>
                  <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><div id="username" runat="server">USERNAME</div></a>
                    <ul class="dropdown-menu" role="menu">
                      <li class="divider"></li>
                      <li class="dropdown-header">User Commands</li>
                      <li><a href="#">Manage Profile</a></li>
                      <li><a href="#">Logout</a></li>
                    </ul>
                  </li>
                </ul>
              </div><!--/.nav-collapse -->
            </div><!--/.container-fluid -->
          </nav>

          </telerik:RadCodeBlock>

        <asp:ContentPlaceHolder ID="MainBodyContentReplacer" runat="server">

        </asp:ContentPlaceHolder>

    </div>

</form>
</body>
</html>

当后面的代码到达这个特定的语句时:

int startIndex = (RadGrid1.CurrentPageIndex * RadGrid1.PageSize);

上面提到的对象引用错误。关键是 RadGrid 为空。为什么当我使用 site.master 时我的 RadGrid 为空,而当我没有站点主服务器时工作正常?我真的很想能够使用站点管理员。提前感谢您对我的问题的任何帮助或见解。

更新: 我正在按照下面的要求添加更多我的 C# 代码的 sn-ps。

这是被触发的任何事件调用以重新查询 radgrid 的方法。

    private void LoadDataForRadGrid1()
    {
        RadGrid1.DataSource = GetWorkOrderRequests();
        RadGrid1.VirtualItemCount = getMaxRowCount();
    }

异常发生在 GetWorkOrderRequests() 中。

private DataTable GetWorkOrderRequests()
    {
        SqlConnection conn = new SqlConnection();
        SqlDataAdapter adapter = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        SqlParameter param;
        DataTable dt = new DataTable();

        conn = FSCommon.GetFederatedConnection();

        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "usp_PM_GetWorkOrderRequests";
        cmd.Parameters.Clear();

        param = new SqlParameter();
        param.ParameterName = "@TenantID";
        param.SqlDbType = System.Data.SqlDbType.BigInt;
        param.Value = FSCommon.TenantID();
        cmd.Parameters.Add(param);

        param = new SqlParameter();
        param.ParameterName = "@Type";
        param.SqlDbType = System.Data.SqlDbType.Bit;
        param.Value = 0; // 0 is for Vesselside Requests screen. 1 is for Work Order Approval on Shoreside.
        cmd.Parameters.Add(param);

        int startIndex = (RadGrid1.CurrentPageIndex * RadGrid1.PageSize);

        param = new SqlParameter();
        param.ParameterName = "@StartIndex";
        param.SqlDbType = System.Data.SqlDbType.Int;
        param.Value = startIndex;
        cmd.Parameters.Add(param);

        param = new SqlParameter();
        param.ParameterName = "@PageSize";
        param.SqlDbType = System.Data.SqlDbType.Int;
        param.Value = RadGrid1.PageSize;
        cmd.Parameters.Add(param);

        adapter.SelectCommand = cmd;

        try
        {
            adapter.Fill(dt);
        }
        catch (Exception ex)
        {
            RenderAlert(ex.Message);
        }
        finally
        {
            conn.Dispose();
            adapter.Dispose();
        }

        return dt;
    }

更新:

添加更多导致异常的事件。

    /// <summary>
    /// Called everytime the page is loaded and rendered on screen.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Page_PreInit();
        }

        Page_PostInit();
    }

    /// <summary>
    /// This is called when !IsPostBack on the first page load event.
    /// </summary>
    private void Page_PreInit()
    {
        LoadDataForRadGrid1();
        RadGrid1.Rebind();
    }

【问题讨论】:

  • 你能发布完整的引发异常的方法或事件吗?
  • @Win 我按要求添加了代码。对我来说奇怪的是,在抛出此异常之前,我的 Page_Load 从未被断点击中。它将在此方法中命中我的断点并返回 RadGrid 为空,但它不会命中我的 Page_Load。如果我取消使用 site.master 部分并完全自己构建页面,它加载正常。
  • 如何调用 LoadDataForRadGrid1?
  • @Win 经过进一步调查,我发现我确实在点击 Page_Load,我只是感到非常沮丧,以至于我的断点位于错误的位置并且没有意识到这一点。所以它进入 Page_Load 并运行 Page_PreInit,然后调用 LoadDataForRadGrid1();

标签: c# asp.net sql-server telerik radgrid


【解决方案1】:

根据您的评论,您在 Page_PreInit 中调用 RadGrid1。

如果您在 Page_PreInit 内部调用,

RadGrid1 将始终为空,因为它尚未创建。

最早可以调用的是Page_Init

ASP.NET Page Life Cycle Overview

PreInit - 在开始阶段完成之后和之前引发 初始化阶段开始。

Init - 在所有控件已初始化且任何皮肤后引发 已应用设置。单个控件的 Init 事件 发生在页面的 Init 事件之前。

解决方案

由于您使用的是 RadGrid,因此您不必显式分配 DataSource。而是在 RadGrid1_NeedDataSource 内分配 DataSource。

如果需要数据,RadGrid 会自动触发 NeedDataSource 事件。

仅供参考:您不应在 NeedDataSource 事件中调用 DataBind() 方法。有关 NeedDataSource 的更多信息,请访问 Telerik UI for ASP.NET AJAX Documentation

【讨论】:

  • 非常感谢!现在一切正常!我会投票,但我还没有所需的代表哈哈。谢谢@Win。标记为已接受的答案。页面生命周期正是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多