我有一个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/