中继器,并添加列标题和ItemTemplate中在页面加载 [英] Repeater and add columns to header and itemtemplate on page load

查看:117
本文介绍了中继器,并添加列标题和ItemTemplate中在页面加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我没有使用中继器更不是显示从数据表的数据。

我建立一个网格,显示角色的用户已被分配,使用复选框显示的用户和列的列表(显示为真/低于假,但pretent他们复选框)。

恩。

|众议员名称|来电|建立更紧密|经理|超级用户|

|鲍勃            |真|真   |假      |假|

|汤姆          |虚假  |假  |真      |真|

基本上使用它的角色管理。

然而,角色可能,所以我想给角色(标题和项目)动态地加载到中继器以后更改。

我不知道如何做到这一点,或者如果它甚至有可能。

我想你抓住当前角色的可能性列表,并将它们加载到HeaderTemplate中,但我不知道如何使用的ItemTemplate匹配,以及如何创建复选框,并把它们在ItemTemplate。

很抱歉,如果它是一个rudementary问题....我AP preciate任何意见!

这是我要得到...虽然我也会为这里没有显示角色和用户返回IDS数据的DataTable的例子。

DataTable的DT =新的DataTable();
          DataColumn的DC =新的DataColumn();

  dc.DataType = Type.GetType(System.String);
      dc.ColumnName =RepName;
      dt.Columns.Add(DC);      DC =新的DataColumn();
      dc.DataType = Type.GetType(System.Boolean);
      dc.ColumnName =来电;
      dt.Columns.Add(DC);      DC =新的DataColumn();
      dc.DataType = Type.GetType(System.Boolean);
      dc.ColumnName =更近;
      dt.Columns.Add(DC);      DC =新的DataColumn();
      dc.DataType = Type.GetType(System.Boolean);
      dc.ColumnName =管理;
      dt.Columns.Add(DC);      DC =新的DataColumn();
      dc.DataType = Type.GetType(System.Boolean);
      dc.ColumnName =超级用户;
      dt.Columns.Add(DC);
      DataRow的排;      行= dt.NewRow();      行[RepName] =乔;
      行[来电] =真;
      行[接近] = FALSE;
      行[管理] =真;
      行[超级用户] = FALSE;
      dt.Rows.Add(行);      行= dt.NewRow();      行[RepName] =鲍勃;
      行[来电] =真;
      行[接近] = FALSE;
      行[管理] =真;
      行[超级用户] = FALSE;
      dt.Rows.Add(行);
      行= dt.NewRow();      行[RepName] =汤姆;
      行[来电] =真;
      行[接近] = FALSE;
      行[管理] =真;
      行[超级用户] = FALSE;
      dt.Rows.Add(行);


解决方案

使用嵌套中继器:外直放站是行,有一个HeaderTemplate中和ItemTemplate中分别包含标题和列复选框内转发器。事情是这样的:

 < ASP:直放站=服务器ID =rowRepeaterOnItemDataBound =rowRepeater_ItemBound>
    <&HeaderTemplate中GT;
        <表>
        &所述; TR>
            < ASP:直放站=服务器ID =headerRepeater>
                <&ItemTemplate中GT;
                    <第i个
                        <%#的Container.DataItem%GT;
                    < /第i
                < / ItemTemplate中>
            < / ASP:直放站>
        < / TR>
    < / HeaderTemplate中>
    <&ItemTemplate中GT;
        &所述; TR>
            < TD>< ASP:标签=服务器ID =lblUserName文本='<%#的eval(密钥)%GT;' />< / TD>
            < ASP:直放站=服务器ID =columnRepeater>
                <&ItemTemplate中GT;
                    &所述; TD>
                        < ASP:HiddenField =服务器ID =hfRoleIndex值='<%#Container.ItemIndex%GT;' />
                        < ASP:复选框=服务器ID =cbColumnValue选中='<%#的Container.DataItem%GT;' OnCheckedChanged =cbColumnValue_CheckedChanged的AutoPostBack =真/>
                    < / TD>
                < / ItemTemplate中>
            < / ASP:直放站>
        < / TR>
    < / ItemTemplate中>
    < FooterTemplate>
        < /表>
    < / FooterTemplate>
< / ASP:直放站>

和在你的code背后:

 词典<字符串,布尔[]> =的UserRole新字典<字符串,布尔[]>(){
    {鲍勃,新布尔[] {真,真,假,假}},
    {添新布尔[] {假的,假的,真正的,真实}},
    {约翰,新布尔[] {假,真,假,真}}
};字符串[] =标题{代表姓名,来电,偷心,经理人,超级用户};保护无效的Page_Load(对象发件人,EventArgs的发送)
{
    如果(!Page.IsPostBack)
    {
        rowRepeater.DataSource =的UserRole;
        rowRepeater.DataBind();
    }
}保护无效rowRepeater_ItemBound(对象发件人,RepeaterItemEventArgs E)
{
    如果(e.Item.ItemType == ListItemType.Header)
    {
        中继headerRepeater = e.Item.FindControl(headerRepeater)作为中继器;
        headerRepeater.DataSource =标题;
        headerRepeater.DataBind();
    }
    否则,如果(e.Item.ItemType == || ListItemType.Item == e.Item.ItemType ListItemType.AlternatingItem)
    {
        中继columnRepeater = e.Item.FindControl(columnRepeater)作为中继器;
        columnRepeater.DataSource =((KeyValuePair<字符串,布尔[]>)e.Item.DataItem).value的;
        columnRepeater.DataBind();
    }
}保护无效cbColumnValue_CheckedChanged(对象发件人,EventArgs的发送)
{
    复选框CB =发件人为复选框;
    HiddenField HF = cb.Parent.FindControl(hfRoleIndex)作为HiddenField;
    INT roleIndex = int.Parse(hf.Value); //现在你有列标识符    标签LBL = cb.Parent.Parent.Parent.FindControl(lblUserName)作为标签;
    字符串username = lbl.Text; //现在你有行标识符    //现在你可以更新数据源
    的UserRole [用户名] [roleIndex] = cb.Checked;
}

I haven't used repeaters for much more than showing data from a datatable.

I am building a grid that that shows a list of users and columns of roles that the user has been assigned, shown with checkboxes (shown with true/false below but pretent they are checkboxes).

ex.

|Rep Name|Caller|Closer|Manager|SuperUser|
|Bob           |True  |true   | false      | false |
|Tom          |false  |false  |True       | True |

Basically using it for roles management.

However the roles may change later on so I want to load the roles(headers and items) dynamically into the repeater.

I am not sure how to do this or if it is even possible.

I figure you grab a list of current role possibilities and load them into the headertemplate but I am not sure how to match those with the itemtemplate and how to create checkboxes and place them in the itemtemplate.

Sorry if it is a rudementary question.... I appreciate any advice!

Datatable example of data that I am going to get... though I will also return ids for roles and users that are not shown here.

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

解决方案

Use nested Repeaters: the outer Repeater is for rows and has a HeaderTemplate and ItemTemplate which contain inner Repeaters for header and checkbox columns respectively. Something like this:

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

and in your code behind:

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

这篇关于中继器,并添加列标题和ItemTemplate中在页面加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆