簡體   English   中英

如何動態將列添加到RadGrid?

[英]How do you dynamically add columns to a RadGrid?

我有一個RadGrid,但我想創建的列數未知。 實際上我知道第一列,它具有PermissionName的DataField。 我有一個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方法來檢索所有Roles:

RoleInfoList roles = RoleInfoList.GetRoleList();

有幾種方法。 首先,您可以使用Telerik原生支持的分層網格方法( 請參閱本主題和子主題 )。 或者,您可以通過執行LINQ語句,然后綁定匿名結果來“拉平”您要綁定的結果。

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

請注意,此方法不是LINQ友好的,因為Join不會轉換為LINQ。

這就是我最終要做的事情:我最終放棄了CSLA數據源,而只是綁定了一個DataTable。 我在創建額外列並調用OnNeedDataSource事件時從RadGrid中刪除了靜態GridBoundColumn:

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

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

我為權限數據創建了一個數據表:

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從角色數據中篩選出權限:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM