我有一个RadGrid,但我想创建的列数未知。实际上,我知道第一列的数据字段为PermissionName。我有一个CSLA数据源,该数据源返回PermissionInfo对象的列表,每个对象都包含RoleInfo对象的列表。当PermissionInfo对象具有不同数量的RoleInfo对象时,如何在RadGrid中为每个RoleInfo对象动态创建一列?

如果任何PermissionInfo对象包含特定的RoleInfo对象,我想创建一个列,其中RoleInfo.RoleName作为标题,而True作为DataValue。如果RoleInfo对象不存在,那么我希望该行和列的DataValue = false。

这是我的RadGrid:

    <telerik:RadGrid ID="rgPermissions" AllowPaging="false" AllowSorting="true" AutoGenerateColumns="false"
    DataSourceID="dsPermissions" runat="server">
    <MasterTableView DataKeyNames="PermissionId" DataSourceID="dsPermissions" EditMode="InPlace">
        <Columns>
            <telerik:GridBoundColumn DataField="PermissionName" HeaderText="Permission" ></telerik:GridBoundColumn>
        </Columns>
    </MasterTableView>
    </telerik:RadGrid>
<csla:CslaDataSource ID="dsPermissions" runat="server" OnSelectObject="dsPermissions_SelectObject">
</csla:CslaDataSource>


这是PermissionInfo中的属性

    public int PermissionId { get; set; }

    public string PermissionName { get; set; }

    public RoleInfoList Roles { get; set; }


以下是RoleInfo中的属性:

    public int RoleId { get; set; }

    public string RoleName { get; set; }

    public string Title { get; set; }


在我的page_load方法中,我还编写了一个Factory方法来检索所有角色:

RoleInfoList roles = RoleInfoList.GetRoleList();

最佳答案

有几种方法。首先,您可以使用Telerik原生支持的分层网格方法(see this topic and subtopics)。或者,您可以通过执行LINQ语句,然后绑定匿名结果来“拉平”您要绑定的结果。

var p in permissions
select new
{
    p.PermissionId,
    p.PermissionName,
    RolesList = String.Join(", ", p.Roles.Select(i => i.RoleName))
}


请注意,此方法不是LINQ友好的,因为Join不会转换为LINQ。

关于c# - 如何动态将列添加到RadGrid?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19772418/

10-09 12:36