Telerik RadGrid在ASP.NET中没有显示任何数据

时间:2017-07-05 13:34:19

标签: asp.net telerik 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)并返回一个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
    }
}

那到底是怎么回事?可能有一些显而易见的遗漏,但现在我没有看到它。

如果这个问题毫无意义,你能否告诉我一段代码可以帮助我创建一个简单的网格?

1 个答案:

答案 0 :(得分:1)

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

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

如果没有看到您的控制器代码,我认为问题在于上面的标记。网格无法使用“{1}”对象将DataField“DoorName”与单个列绑定到DoorAccess对象(不知道“月”的位置)来自(哪里)。确保DataKeyName属性包含DataKeyName对象中的唯一值,并且列DoorAccess等于DataField对象中的任何属性。

ASPX:

DoorAccess

C#:

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

我首先尝试使用自动生成的列来确保从NeedDataSource事件返回有效数据,然后确保您的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; } DataKeyNames是有效的属性。另外正如@ Seano666所说,因为你的网格处于DataFields任何错误,RadGrid会因格式错误而被抛出。