Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
diogo.delgaudio

checkbox no repeater

Recommended Posts

diogo.delgaudio

bem pessoal, minha dúvida é a seguinte... coloquei no header do meu repeater um checkbox e a coluna abaixo deste header contém vários outros checkbox, gostaria q ao marcar o cabeçalho, todos os checkbox abaixo dele ficassem marcados e o mesmo acontecesse no inverso. mas n sei como verificar se este componente está marcado, alguém?


- Roger that.<br />- Affirmative.

Share this post


Link to post
Share on other sites
killercode

Ok...

O método mais fácil, mas que eu detesto pois obriga-te a fazer um post back e isso demora tempo... é usares este codigo

no ficheiro teste.aspx metes:

<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate><asp:CheckBox ID="checkAll" OnCheckedChanged="CheckBox1_CheckedChanged" Checked = "false" runat="server" AutoPostBack="true" />Select All<br /></HeaderTemplate>
<ItemTemplate><asp:CheckBox runat="server" ID="check" /><br /></ItemTemplate>
</asp:Repeater>

e no ficheiro teste.aspx.cs metes:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            BindData();
        }
    }

    private void BindData()
    {
        System.Collections.Generic.List<String> teste = new System.Collections.Generic.List<string>();
        for (int i = 0; i < 10; i++)
        {
            teste.Add(i.ToString());
        }
        Repeater1.DataSource = teste;
        Repeater1.DataBind();
    }

    protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox cMain = (CheckBox)sender;
        foreach (RepeaterItem ri in Repeater1.Items)
        {
            if (cMain.Checked)
            {
                if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem)
                {
                    CheckBox cb = (CheckBox)ri.FindControl("check");
                    cb.Checked = true;
                }
            }
            else
            {
                if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem)
                {
                    CheckBox cb = (CheckBox)ri.FindControl("check");
                    cb.Checked = false;
                }
            }
        }
    }

Tens depois uma solução que para mim é a ideal.... JAVASCRIPT :D

É mais rapido e mais leve, pois assim funciona no clientside e não precisas de estar a gastar recursos do servidor...

se tiveres duvidas é so postares :)

codigo no teste.aspx:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <script language ="javascript">
    function CheckValues(source, args)
    {
        var ctrl = 'Repeater1'; 
        var cbName = 'check';
        var cbHead = 'checkAll'
        var objForm = document.form1; 
        var errorCount = 0; 
        var isChecked = false; 
        //very important to start at 0
        var i = 1;
    
        ctrlName = ctrl + '_ctl0' + i + '_' + cbName;
        var curItem = DOMCall(ctrlName);
        if(null == curItem)
        {
            alert (curItem.toString() + ' é nulo'); // something is wrong. Probably one of the 'Customize Values'
        }
        
        while (curItem != null)
        {
            //to check items inside the DataGrid/Repeater
            //using the != null check should keep it from getting locked up
            var header = DOMCall(ctrl+'_ctl00_'+cbHead);
            if (header.checked == true)
            curItem.checked = true;
            else
            curItem.checked = false;
            if(i >= 10)
            {
                ctrlName = ctrl + '_ctl' + i + '_' +  cbName;
            }
            else    
            {
                ctrlName = ctrl + '_ctl0' + i + '_' +  cbName;
            }      
                          
            curItem = DOMCall(ctrlName);  
            i += 1           
        }
    }
    function DOMCall(name) 
    {
      //Checks the DOM features available
       if (document.layers) //checks document.layers
            return document.layers[name];
       else if (document.all) //checks document.all
            return document.all[name];
       else if (document.getElementById) //checks getElementById
            return document.getElementById(name);
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
        <HeaderTemplate><asp:CheckBox ID="checkAll"  Checked = "false" runat="server" />Select All<br /></HeaderTemplate>
        <ItemTemplate><asp:CheckBox runat="server" ID="check" /><br /></ItemTemplate>
        </asp:Repeater>
        </div>
    </form>
</body>
</html>

Codigo no teste.aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            BindData();
        }
    }

    private void BindData()
    {
        System.Collections.Generic.List<String> teste = new System.Collections.Generic.List<string>();
        for (int i = 0; i < 10; i++)
        {
            teste.Add(i.ToString());
        }
        Repeater1.DataSource = teste;
        Repeater1.DataBind();
    }

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Header)
        {
            for (int i = 0; i < e.Item.Controls.Count; i++)
            {
                if (e.Item.Controls[i] is System.Web.UI.WebControls.CheckBox)
                {
                    ((CheckBox)e.Item.Controls[i]).Attributes.Add("onclick", "return CheckValues(); return false;");
                }
            }
        }
    }

Bom... agora que ja resolvi o teu problema vou para a cama

Hasta :D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.