首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将列动态添加到RadGrid中?

如何将列动态添加到RadGrid中?
EN

Stack Overflow用户
提问于 2013-11-04 16:35:39
回答 2查看 9.8K关注 0票数 2

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

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

这是我的RadGrid:

代码语言:javascript
代码运行次数:0
运行
复制
    <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中的属性

代码语言:javascript
代码运行次数:0
运行
复制
    public int PermissionId { get; set; }

    public string PermissionName { get; set; }

    public RoleInfoList Roles { get; set; }

以下是RoleInfo中的属性

代码语言:javascript
代码运行次数:0
运行
复制
    public int RoleId { get; set; }

    public string RoleName { get; set; }

    public string Title { get; set; }

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

代码语言:javascript
代码运行次数:0
运行
复制
RoleInfoList roles = RoleInfoList.GetRoleList();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-06 17:15:16

下面是我最后所做的:我最终放弃了CSLA数据源,而只是简单地绑定了一个DataTable。在创建额外的列时,我从我的GridBoundColumn中删除了静态RadGrid,并调用了OnNeedDataSource事件:

代码语言:javascript
代码运行次数:0
运行
复制
<telerik:RadGrid ID="rgPermissions" AllowPaging="false" AllowSorting="true" OnNeedDataSource="rgPermissions_NeedDataSource"
    runat="server">
    <MasterTableView DataKeyNames="Permission Name" AutoGenerateColumns="true" EditMode="InPlace">
        <Columns>
            <telerik:GridEditCommandColumn />
        </Columns>
    </MasterTableView>
</telerik:RadGrid>

然后我填写了我的事件处理程序,使用CSLA工厂方法创建DataTable:

代码语言:javascript
代码运行次数:0
运行
复制
protected void rgPermissions_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
    // Data Access
    PermissionInfoList permissions = PermissionInfoList.GetPermissionInfoList();
    RoleInfoList roles = RoleInfoList.GetRoleList();

    // create datatable for permissions
    DataTable permissionTable = CreatePermissionDataTable(roles);
    foreach (PermissionInfo permission in permissions)
    {
        // Add permission name
        DataRow dataRow = permissionTable.NewRow();
        dataRow["Permission Name"] = permission.PermissionName;

        AddRow(permission, permissionTable, dataRow, roles);
    }

    rgPermissions.DataSource = permissionTable;
}

我为权限数据创建了一个DataTable:

代码语言:javascript
代码运行次数:0
运行
复制
private DataTable CreatePermissionDataTable(RoleInfoList roles)
{
    DataTable permissions = new DataTable();
    permissions.Columns.Add("Permission Name", typeof(string));
    permissions.Columns["Permission Name"].ReadOnly = true;
    foreach (RoleInfo role in roles)
    {
        permissions.Columns.Add(role.Title, typeof(Boolean));
    }
    return permissions;
}

我确实使用LINQ从角色数据中筛选出权限:

代码语言:javascript
代码运行次数:0
运行
复制
private DataTable AddRow(PermissionInfo permission, DataTable permissions, DataRow dataRow, RoleInfoList roles)
{

    // Add roles
    foreach (RoleInfo role in roles)
    {
        dataRow[role.Title] = permission.Roles.Any(r => r.RoleId == role.RoleId);
    }
    permissions.Rows.Add(dataRow);

    return permissions;
}
票数 0
EN

Stack Overflow用户

发布于 2013-11-04 17:04:24

有几种方法;首先,您可以使用分层网格方法,Telerik本机支持这种方法(请参阅本主题和副主题。)。或者,您可以通过执行LINQ语句“平平”要绑定的结果,然后绑定匿名结果。

代码语言:javascript
代码运行次数:0
运行
复制
var p in permissions
select new
{
    p.PermissionId,
    p.PermissionName,
    RolesList = String.Join(", ", p.Roles.Select(i => i.RoleName))
}

注意,这种方法不是LINQ友好的,因为联接没有被翻译成LINQ。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19772418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档