Я не использовал повторители для намного больше, чем показ данных из таблицы данных.
Я создаю сетку, что это показывает список пользователей и столбцы ролей, что пользователю присвоили, показали с флажками (показанный с истинным/ложным ниже, но предварительная палатка они - флажки).
напр.
|Rep Name|Caller|Closer|Manager|SuperUser |
|Bob |True |true | ложь | ложь |
|Tom |false |false |True | Верный |
В основном с помощью него для ролевого управления.
Однако роли могут измениться позже, таким образом, я хочу загрузить роли (заголовки и объекты) динамично в повторитель.
Я не уверен, как сделать это или если это даже возможно.
Я полагаю, что Вы захватываете список текущих ролевых возможностей и загружаете их в headertemplate, но я не уверен, как соответствовать тем, которые имеют itemtemplate и как создать флажки и разместить их в itemtemplate.
Извините, если это - элементарный вопрос.... Я ценю любой совет!
Пример таблицы данных данных, которые я собираюсь получить..., хотя я также возвращу идентификаторы для ролей и пользователей, которых не показывают здесь.
DataTable dt = новый DataTable (); DataColumn dc = новый DataColumn ();
dc.DataType = Type.GetType("System.String");
dc.ColumnName = "RepName";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.DataType = Type.GetType("System.Boolean");
dc.ColumnName = "Caller";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.DataType = Type.GetType("System.Boolean");
dc.ColumnName = "closer";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.DataType = Type.GetType("System.Boolean");
dc.ColumnName = "Admin";
dt.Columns.Add(dc);
dc = new DataColumn();
dc.DataType = Type.GetType("System.Boolean");
dc.ColumnName = "SuperUser";
dt.Columns.Add(dc);
DataRow row;
row = dt.NewRow();
row["RepName"] = "Joe";
row["Caller"] = true;
row["closer"] = false;
row["Admin"] = true;
row["SuperUser"] = false;
dt.Rows.Add(row);
row = dt.NewRow();
row["RepName"] = "Bob";
row["Caller"] = true;
row["closer"] = false;
row["Admin"] = true;
row["SuperUser"] = false;
dt.Rows.Add(row);
row = dt.NewRow();
row["RepName"] = "Tom";
row["Caller"] = true;
row["closer"] = false;
row["Admin"] = true;
row["SuperUser"] = false;
dt.Rows.Add(row);
Используйте вложенные повторители: внешний повторитель предназначен для строк и имеет HeaderTemplate и ItemTemplate, которые содержат внутренние повторители для столбцов заголовка и флажка соответственно. Примерно так:
<asp:Repeater runat="server" ID="rowRepeater" OnItemDataBound="rowRepeater_ItemBound">
<HeaderTemplate>
<table>
<tr>
<asp:Repeater runat="server" ID="headerRepeater">
<ItemTemplate>
<th>
<%# Container.DataItem %>
</th>
</ItemTemplate>
</asp:Repeater>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><asp:Label runat="server" ID="lblUserName" Text='<%# Eval("Key") %>' /></td>
<asp:Repeater runat="server" ID="columnRepeater">
<ItemTemplate>
<td>
<asp:HiddenField runat="server" ID="hfRoleIndex" Value='<%# Container.ItemIndex %>' />
<asp:CheckBox runat="server" ID="cbColumnValue" Checked='<%# Container.DataItem %>' OnCheckedChanged="cbColumnValue_CheckedChanged" AutoPostBack="true" />
</td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
и в вашем коде позади:
Dictionary<string, bool[]> userRoles = new Dictionary<string, bool[]>(){
{"Bob", new bool[]{true,true,false,false}},
{"Tim",new bool[]{false,false,true,true}},
{"John",new bool[]{false,true,false,true}}
};
string[] headings = { "Rep Name", "Caller", "Closer", "Manager", "SuperUser" };
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
rowRepeater.DataSource = userRoles;
rowRepeater.DataBind();
}
}
protected void rowRepeater_ItemBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
Repeater headerRepeater = e.Item.FindControl("headerRepeater") as Repeater;
headerRepeater.DataSource = headings;
headerRepeater.DataBind();
}
else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater columnRepeater = e.Item.FindControl("columnRepeater") as Repeater;
columnRepeater.DataSource = ((KeyValuePair<string, bool[]>)e.Item.DataItem).Value;
columnRepeater.DataBind();
}
}
protected void cbColumnValue_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = sender as CheckBox;
HiddenField hf = cb.Parent.FindControl("hfRoleIndex") as HiddenField;
int roleIndex = int.Parse(hf.Value); // now you have the column identifier
Label lbl = cb.Parent.Parent.Parent.FindControl("lblUserName") as Label;
string userName = lbl.Text; //now you have the row identifier
//now you can update your data source
userRoles[userName][roleIndex] = cb.Checked;
}
Я попробую что-нибудь вроде этого:
<asp:GridView ID="OrdersGV" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="UserName" />
<asp:TemplateField>
<ItemTemplate>
<asp:ListView ID="NewsLV" runat="server">
<ItemTemplate>
<td id="Td1" runat="server" valign="top" style="width: 30px;">
<asp:Label ID="Label1" runat="server" Text='<%# Eval("RoleName") %>' Visible='<%# Container.DataItemIndex == 0%>'></asp:Label>
<div style="padding: 2px;">
<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("IsRoleSelected") %>' />
</div>
</td>
</ItemTemplate>
<LayoutTemplate>
<table id="Table1" runat="server" border="0" style="">
<tr id="itemPlaceholderContainer" runat="server">
<td id="itemPlaceholder" runat="server">
</td>
</tr>
</table>
</LayoutTemplate>
</asp:ListView>
</ItemTemplate>
</asp:TemplateField>
</Columns>