c# - 转发器并在页面加载时将列添加到标题和项目模板

标签 c# asp.net repeater

除了显示数据表中的数据外,我没有使用中继器。

我正在构建一个网格,该网格显示用户列表和已分配给用户的角色列,显示有复选框(在下面显示为 true/false,但假装它们是复选框)。

例如

|代表姓名|来电者|关闭者|经理| super 用户|
|鲍勃 |真|真|假 |假 |
|汤姆 |false |false |True |正确 |

主要用于角色管理。

但是角色稍后可能会改变,所以我想将角色(标题和项目)动态加载到转发器中。

我不确定该怎么做,或者是否可能。

我认为您获取了当前角色可能性的列表并将它们加载到 headertemplate 中,但我不确定如何将它们与 itemtemplate 匹配以及如何创建复选框并将它们放置在 itemtemplate 中。

抱歉,如果这是一个粗鲁的问题....我很感激任何建议!

我将要获取的数据的数据表示例...尽管我还将返回此处未显示的角色和用户的 ID。

DataTable dt = new DataTable(); DataColumn dc = new 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);

最佳答案

使用嵌套的 Repeater:外部 Repeater 用于行,并且有一个 HeaderTemplate 和 ItemTemplate,它们分别包含用于标题和复选框列的内部 Repeater。像这样:

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

关于c# - 转发器并在页面加载时将列添加到标题和项目模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2748108/

相关文章:

C# - 如何使一系列方法调用成为原子的?

c# - ASP.NET Core MVC 中的 Crystal Reports 错误。无法加载文件

c# - Azure 部署带有纯文本连接字符串的 web.config 文件

c# - 中继器 - 在 "content"中带有滚动条的固定页眉和固定脚

c# - 使用javascript选中和取消选中转发器控件中的复选框?

asp.net - 显示/隐藏列表的一部分

c# - 无法搜索 DataTable,因为行值在添加后为空

c# - 使用正则表达式获取部分匹配值

c# - 我可以获取网站引用的所有程序集吗

asp.net - <asp :ContentPlaceholder> generates parser exception 中的 &lt;meta&gt; 标记