Повторитель и добавляет столбцы к заголовку и itemtemplate на загрузке страницы

Я не использовал повторители для намного больше, чем показ данных из таблицы данных.

Я создаю сетку, что это показывает список пользователей и столбцы ролей, что пользователю присвоили, показали с флажками (показанный с истинным/ложным ниже, но предварительная палатка они - флажки).

напр.

|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);
6
задан sdmiller 2 May 2010 в 12:43
поделиться

2 ответа

Используйте вложенные повторители: внешний повторитель предназначен для строк и имеет 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;
}
7
ответ дан 17 December 2019 в 00:05
поделиться

Я попробую что-нибудь вроде этого:

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

0
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: