【发布时间】: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