使用站点主站

时间:2015-05-19 17:51:22

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

我正在尝试将当前的Web项目转换为使用网站母版,而不是在每个页面上都有我的导航和标题。

我在使用site.master的内容页面上定义了RadGrid。如果我尝试启动项目,那么任何尝试访问RadGrid属性的内容都会出错,并且#34;对象引用未设置为对象的实例。"

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

以下是我想要做的一些小片段:

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为null。当我使用site.master时,我的RadGrid为null,并且当我没有网站主人时工作正常吗?我真的很想能够使用网站管理员。在此先感谢您对我的问题的任何帮助或见解。

更新 我按照以下要求添加了更多我的C#Code Behind片段。

这是通过触发重新查询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();
    }

1 个答案:

答案 0 :(得分:1)

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

如果您在 Page_PreInit 内部调用,RadGrid1将始终为null,因为尚未创建它。

您最早可以打电话的是 Page_Init

请看ASP.NET Page Life Cycle Overview

  

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

     

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

解决方案

由于您使用的是 RadGrid ,因此您无需明确指定 DataSource 。而是在 RadGrid1_NeedDataSource

中分配DataSource

RadGrid会在需要数据时自动触发NeedDataSource事件。

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