Telerik RadGrid 未显示 ASP.NET 中的任何数据
Telerik RadGrid not showing any data in ASP.NET
我正在尝试为 ASP.NET 页面上的一些数据制作一个非常简单的网格,但显然我在这里做错了。首先,让我向您展示我在客户端的网格:
<asp:Panel runat="server" ID="pnlDoorAccess" Visible="False">
<asp:UpdatePanel runat="server" ID="upnlDoorAccess" UpdateMode="Conditional" ChildrenAsTriggers="false">
<ContentTemplate>
<tel:RadGrid runat="server" ID="gvDoorAccess" AllowSorting="false" AllowPaging="false"
CssClass="col-sm-12 noPadding" MasterTableView-CssClass="table table-hover table-header-bg table-striped no-footer tableHeaderBorder"
OnNeedDataSource="radDoorAccess_NeedDataSource" OnItemDataBound="radDoorAccess_ItemDataBound">
<MasterTableView AutoGenerateColumns="false" TableLayout="Fixed" Caption="" FilterExpression="" AllowNaturalSort="false" DataKeyNames="Month" NoMasterRecordsText="No records to Display">
<Columns>
<tel:GridBoundColumn DataField="DoorName" HeaderText="Door Name" UniqueName="DoorName"></tel:GridBoundColumn>
</Columns>
</MasterTableView>
</tel:RadGrid>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
所以我想通过仅显示 1 列 (DoorName) 来测试网格,但到目前为止它没有显示任何内容。接下来是服务器端代码:
当 Object Memorystore 为空时,DoorAccess 属性 将启动 Controller.GetDoorAccess(CurrentUser.Id)
并且 return 我将 return 并最终存储到 DataSource 中的 DataTable 对象属性稍后。
protected List<DoorAccess> DoorAccess
{
get
{
if (omsDoorAccess.DataItem == null || omsDoorAccess.DataItem.GetType() != typeof(List<Option>)) omsDoorAccess.DataItem = Controller.GetDoorAccess(CurrentUser.Id);
return (omsDoorAccess.DataItem as List<DoorAccess>);
}
set
{
omsDoorAccess.DataItem = value;
}
}
protected void Page_Load(Object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
LoadTab_DoorAccess();
}
}
private void LoadTab_DoorAccess()
{
// Future implementation
ReloadTab_DoorAccess();
}
private void ReloadTab_DoorAccess()
{
gvDoorAccess.DataBind();
upnlDoorAccess.DataBind();
upnlDoorAccess.Update();
}
protected void radDoorAccess_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
(sender as RadGrid).DataSource = DoorAccess;
// DoorAccess holds 128 items
}
protected void radDoorAccess_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item.ItemType != GridItemType.Item && e.Item.ItemType != GridItemType.AlternatingItem)
{
// Do stuff in the future
}
}
那么这里到底发生了什么?可能有一些明显的东西我错过了,但现在我没有看到它。
如果这个问题没有意义,你能给我看一段代码来帮助我创建一个简单的网格吗?
我看到您有 AutoGeneratedColumns="False"
、一个用 DataField="DoorName"
和 DataKeyName="Month"
声明的列。
使用 Advanced DataBinding 时,您要绑定的数据源必须与 RadGrid 中的模式匹配,除非您使用的是 AutoGenerateColumns。
没有看到你的控制器代码,我认为问题出在上面的标记上。 grid没办法把"DoorName"的DataField
单列绑定到DoorAccess
对象上,使用"Month"的DataKeyName
(不知道在哪"Month" 来自)。确保 DataKeyName
属性 包含来自 DoorAccess
对象的唯一值,并且 DataField
列等于 DoorAccess
中的任何 属性对象。
ASPX:
<telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource">
<MasterTableView AutoGenerateColumns="False" DataKeyNames="Id" CommandItemDisplay="Top">
<Columns>
<telerik:GridBoundColumn DataField="Id" UniqueName="MyId" HeaderText="My Id"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="Value" UniqueName="Value" HeaderText="My Value"></telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
C#:
public class MyDataModel
{
public int Id { get; set; }
public string Value { get; set; }
}
protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
List<MyDataModel> datasource = new List<MyDataModel>();
for (i = 0; i <= 10; i++) {
datasource.Add(new MyDataModel {
Id = i,
Value = "Value" + i.ToString
});
}
((RadGrid)sender).DataSource = datasource;
}
我会首先尝试启用自动生成的列,以确保从 NeedDataSource 事件返回有效数据,然后确保您的 DataKeyNames
和 DataFields
是有效属性。此外,正如 @Seano666 所说,因为您的网格处于 UpdatePanel
中,RadGrid 由于格式不正确而抛出的任何错误都将被抑制。
我正在尝试为 ASP.NET 页面上的一些数据制作一个非常简单的网格,但显然我在这里做错了。首先,让我向您展示我在客户端的网格:
<asp:Panel runat="server" ID="pnlDoorAccess" Visible="False">
<asp:UpdatePanel runat="server" ID="upnlDoorAccess" UpdateMode="Conditional" ChildrenAsTriggers="false">
<ContentTemplate>
<tel:RadGrid runat="server" ID="gvDoorAccess" AllowSorting="false" AllowPaging="false"
CssClass="col-sm-12 noPadding" MasterTableView-CssClass="table table-hover table-header-bg table-striped no-footer tableHeaderBorder"
OnNeedDataSource="radDoorAccess_NeedDataSource" OnItemDataBound="radDoorAccess_ItemDataBound">
<MasterTableView AutoGenerateColumns="false" TableLayout="Fixed" Caption="" FilterExpression="" AllowNaturalSort="false" DataKeyNames="Month" NoMasterRecordsText="No records to Display">
<Columns>
<tel:GridBoundColumn DataField="DoorName" HeaderText="Door Name" UniqueName="DoorName"></tel:GridBoundColumn>
</Columns>
</MasterTableView>
</tel:RadGrid>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
所以我想通过仅显示 1 列 (DoorName) 来测试网格,但到目前为止它没有显示任何内容。接下来是服务器端代码:
当 Object Memorystore 为空时,DoorAccess 属性 将启动 Controller.GetDoorAccess(CurrentUser.Id)
并且 return 我将 return 并最终存储到 DataSource 中的 DataTable 对象属性稍后。
protected List<DoorAccess> DoorAccess
{
get
{
if (omsDoorAccess.DataItem == null || omsDoorAccess.DataItem.GetType() != typeof(List<Option>)) omsDoorAccess.DataItem = Controller.GetDoorAccess(CurrentUser.Id);
return (omsDoorAccess.DataItem as List<DoorAccess>);
}
set
{
omsDoorAccess.DataItem = value;
}
}
protected void Page_Load(Object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
LoadTab_DoorAccess();
}
}
private void LoadTab_DoorAccess()
{
// Future implementation
ReloadTab_DoorAccess();
}
private void ReloadTab_DoorAccess()
{
gvDoorAccess.DataBind();
upnlDoorAccess.DataBind();
upnlDoorAccess.Update();
}
protected void radDoorAccess_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
(sender as RadGrid).DataSource = DoorAccess;
// DoorAccess holds 128 items
}
protected void radDoorAccess_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item.ItemType != GridItemType.Item && e.Item.ItemType != GridItemType.AlternatingItem)
{
// Do stuff in the future
}
}
那么这里到底发生了什么?可能有一些明显的东西我错过了,但现在我没有看到它。
如果这个问题没有意义,你能给我看一段代码来帮助我创建一个简单的网格吗?
我看到您有 AutoGeneratedColumns="False"
、一个用 DataField="DoorName"
和 DataKeyName="Month"
声明的列。
使用 Advanced DataBinding 时,您要绑定的数据源必须与 RadGrid 中的模式匹配,除非您使用的是 AutoGenerateColumns。
没有看到你的控制器代码,我认为问题出在上面的标记上。 grid没办法把"DoorName"的DataField
单列绑定到DoorAccess
对象上,使用"Month"的DataKeyName
(不知道在哪"Month" 来自)。确保 DataKeyName
属性 包含来自 DoorAccess
对象的唯一值,并且 DataField
列等于 DoorAccess
中的任何 属性对象。
ASPX:
<telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource">
<MasterTableView AutoGenerateColumns="False" DataKeyNames="Id" CommandItemDisplay="Top">
<Columns>
<telerik:GridBoundColumn DataField="Id" UniqueName="MyId" HeaderText="My Id"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="Value" UniqueName="Value" HeaderText="My Value"></telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
C#:
public class MyDataModel
{
public int Id { get; set; }
public string Value { get; set; }
}
protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
List<MyDataModel> datasource = new List<MyDataModel>();
for (i = 0; i <= 10; i++) {
datasource.Add(new MyDataModel {
Id = i,
Value = "Value" + i.ToString
});
}
((RadGrid)sender).DataSource = datasource;
}
我会首先尝试启用自动生成的列,以确保从 NeedDataSource 事件返回有效数据,然后确保您的 DataKeyNames
和 DataFields
是有效属性。此外,正如 @Seano666 所说,因为您的网格处于 UpdatePanel
中,RadGrid 由于格式不正确而抛出的任何错误都将被抑制。