【问题标题】:Telerik RadGrid not showing any data in ASP.NETTelerik RadGrid 未在 ASP.NET 中显示任何数据
【发布时间】:2017-07-05 13:34:19
【问题描述】:

我正在尝试为 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),并返回一个 DataTable 对象,我将返回并最终将其存储到 DataSource 属性中。

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
    }
}

那么这里到底发生了什么?我可能缺少一些明显的东西,但现在我看不到它。

如果这个问题没有意义,你能给我看一段代码来帮助我创建一个简单的网格吗?

【问题讨论】:

  • 将网格放在 UpdatePanel 中会严重妨碍调试。尝试将其从 UpdatePanel 中取出,看看您是否收到有用的错误或信息。例如,NeedDataSource 事件中是否有断点命中? ItemDataBound 事件中是否命中断点?

标签: asp.net telerik radgrid


【解决方案1】:

我看到你有AutoGeneratedColumns="False",一个用DataField="DoorName" 声明的列和DataKeyName="Month"

使用高级数据绑定时,您要绑定的数据源必须与 RadGrid 中的架构匹配,除非您使用 AutoGenerateColumns。

没有看到您的控制器代码,我认为问题出在上述标记上。网格无法使用“Month”的DataKeyName 将具有“DoorName”的DataField 的单列绑定到DoorAccess 对象(不知道“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 事件返回有效数据,然后确保您的 DataKeyNamesDataFields 是有效属性。此外,正如@Seano666 所说,由于您的网格位于UpdatePanel 中,RadGrid 由于格式不正确而引发的任何错误都将被抑制。

【讨论】:

  • 这似乎是一个有效的工作解决方案。但是我收到以下错误:No property or field 'Filter' exists in type 'MyDataModel'。我尝试使用的任何类都出现此错误。我对此一无所知。
  • 刚刚注意到,当我不在 forloop 中将项目添加到我的数据源时,我不再收到错误消息。即使我尝试 datasource.Add(null);我仍然会在上一条评论中收到错误消息。
  • 我将 EnableLinqExpressions="false" 添加到我的 radgrid 中,现在 radgrid 显示完美!
  • 有趣的问题。很高兴您找到了解决方案。上面的代码对我来说效果很好。我相信原因是当绑定到 DataType 未知的某些对象(例如 EntityDataSource 或其他控制器)时,Linq 无法正确呈现。这就是禁用LinqExpressions 解决问题的原因。 A similar Error
  • 另外,我看到在MasterTableView 节点中你有FilterExpression="" 如果你删除它,我猜问题可能会消失
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2014-12-27
相关资源
最近更新 更多