我有一个RadGrid,我希望创建一个未知数量的列。实际上我知道第一列,其DataField为PermissionName
。我有一个CSLA数据源,它返回PermissionInfo
个对象的列表,每个对象都包含RoleInfo
个对象的列表。当PermissionInfo对象具有不同数量的RoleInfo
对象时,如何为每个RoleInfo对象在RadGrid中动态创建列?
如果任何 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
方法中,我还编写了一个工厂方法来检索所有角色:
RoleInfoList roles = RoleInfoList.GetRoleList();
答案 0 :(得分:0)
有几种方法;首先,您可以使用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。
答案 1 :(得分:0)
以下是我最终做的事情: 我最终放弃了CSLA数据源,而只是简单地绑定了DataTable。我从RadGrid中删除了静态GridBoundColumn,因为它正在创建一个额外的列,并调用OnNeedDataSource事件:
<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;
}
我为Permission数据创建了一个DataTable:
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;
}