Avatar billede beef12 Nybegynder
05. december 2006 - 18:47 Der er 16 kommentarer og
1 løsning

Opsamle alle CheckBoxes

Jeg har en metode. Som opsamler alle markerede checkboxes og appender dem til en liste:

    protected void SaveBtn_Click(object sender, EventArgs e)
    {
        List<string> lst = new List<string>();
        foreach(Control ctl in Page.Controls) {

            if(ctl is CheckBox)
            {
                CheckBox box = (CheckBox)ctl;
                if (box.Checked)
                {
                    lst.Add(box.ID);
                }
            }
        }
  }

Problemet er, at det ikke virker - hvad gør jeg galt?
Avatar billede helmet Nybegynder
05. december 2006 - 19:08 #1
Er ikke helt inde i hvilke objekter der ligger i page objektet, men det består i hvert fald af et htmlform objekt, som er det dine kontroller ligger i.
Så dit check kan laves således
List<string> lst = new List<string>();
foreach (Control ctl in Page.Controls)
{
    if(ctl is HtmlForm)
        {
            HtmlForm ctlForm= (HtmlForm)ctl;
                foreach (Control ctl2 in ctlForm.Controls)
                {
                    if (ctl2 is CheckBox)
                        {
                            CheckBox box = (CheckBox)ctl2;
                            if (box.Checked)
                            {
                                lst.Add(box.ID);
                            }
                }
        }
    }
}
Avatar billede beef12 Nybegynder
05. december 2006 - 19:37 #2
Det giver samme resultat... Listen er stadig tom efter kørsel
Avatar billede helmet Nybegynder
05. december 2006 - 19:39 #3
Ok, ligger dine ckeckbokse så inde i en panel, checkboxlist, datalist, repeater eller lignende?
Avatar billede beef12 Nybegynder
05. december 2006 - 19:41 #4
Selve checkbox'ene bliver genereret ud fra indholdet i min database. Her er den checkbox-html som bliver genereret.

<tr>
        <td colspan="2">COmp</td>
    </tr><tr>
        <td>Cmp1</td><td><input id="14" type="checkbox" name="14" /></td>
    </tr><tr>
        <td>Cmp2</td><td><input id="15" type="checkbox" name="15" /></td>
    </tr>

Ser du noget heri som kunne være problemet?
Avatar billede beef12 Nybegynder
05. december 2006 - 19:47 #5
de ligger i en asp:table
Avatar billede helmet Nybegynder
05. december 2006 - 20:01 #6
Jeg er en ide, men der er et par problemer

Hvis du vil søge på input checkboxen som en asp.net Checkbox kontrol skal du sætte runat="server" ind på alle checkboksene.

Dernæst kan det blive lidt svært og finde dem når du kun søger et niveau ind, asp.net er jo object orienteret, så alle objekter består af objekter, og der er ingen der siger at checkboksene ligger i yderste niveau.
Avatar billede beef12 Nybegynder
05. december 2006 - 20:05 #7
problemet er at jeg generer mine checkboxes - så jeg kender ikke id'erne. Jeg generer sådan her:

DataSet ds = ConnectDb.ExecuteReader(sql);
        foreach (DataTable table in ds.Tables)
        {
            foreach (DataRow row in table.Rows)
            {
                TableRow fillRow = new TableRow();
                TableCell cellRoleTxt = new TableCell();
                TableCell cellRoleCheck = new TableCell();
                cellRoleTxt.Text = row["title"].ToString();
                CheckBox box = new CheckBox(); box.ID = row["compId"].ToString();
                cellRoleCheck.Controls.Add(box);
                fillRow.Controls.Add(cellRoleTxt); fillRow.Controls.Add(cellRoleCheck);
                GenTable.Controls.Add(fillRow);
            }
        }

Mener ikke at man kan sætte runat-attributten her. Eller kan man?
Avatar billede helmet Nybegynder
05. december 2006 - 20:20 #8
Nej, mon ikke den kan finde den når du opretter dem sådan, men situation 2 er stadig aktuel, vi skal igennem alle niveauerne af objekter og lede efter checkbokse.

Har lige smidt en rekursiv funktion sammen, som undersøger om der er checkbokse i alle kontroller under udgangs kontrollen.

protected void FindCheckbox(Control enControl, List<string> lst)
    {
        foreach (Control ctl in enControl.Controls)
        {
            if(ctl is CheckBox)
            {
                CheckBox box = (CheckBox)ctl;
                if (box.Checked)
                    lst.Add(box.ID);
            }
            else
                if(ctl.Controls.Count > 0)
                    FindCheckbox(ctl, lst);
        }
    }

Hvis du har navngivet din tabel så kan du starte i den
Fx
FindCheckbox(tabel1, lst)
ellers kan du starte i page
FindCheckbox(Page, lst)
Avatar billede beef12 Nybegynder
05. december 2006 - 20:30 #9
Nu har jeg lavet denne:
        List<string> lst = new List<string>();
        foreach (Control c in Page.Controls)
        {
            foreach (Control childc in c.Controls)
            {
                    lst.Add(childc.ToString());
                    foreach (Control childc2 in childc.Controls)
                    {
                        lst.Add(childc2.ToString());
                        foreach (Control childc3 in childc2.Controls)
                        {
                            lst.Add(childc3.ToString());
                            foreach (Control childc4 in childc3.Controls)
                            {
                                lst.Add(childc4.ToString());
                            }
                        }
                    }
            }
        }

Og jeg rammer ikke en eneste checkbox.

Jeg har nu også indsat din metode - igen finder den ikke noget...
Avatar billede helmet Nybegynder
05. december 2006 - 20:42 #10
Ja det er jo noget hø.
Har lige prøvet og bruge din kode til og generere en test tabel, og finder fint alle afkrydsede checkbokse med min funktion, men det løser jo ikke dit problem.
Avatar billede beef12 Nybegynder
05. december 2006 - 20:49 #11
Se her:

        foreach (Control ctl in enControl.Controls)
        {
            lst.Add(ctl.ToString());
   
            if (ctl.Controls.Count >0)
              FindCheckbox(ctl, lst);
        }

Denne funktion finder ALT undtaget mine checkboxes - så må simpelthen være fordi at runat=server mangler. Gad vide hvordan jeg får sat den attribut når jeg genererer mine controls...
Avatar billede helmet Nybegynder
05. december 2006 - 21:05 #12
Meget underligt, har som sagt ikke problemer med og finde dem i min test.
Du kan da godt se den
protected void Page_Load(object sender, EventArgs e)
{
    Table GenTable = new Table();
    for (int i = 1; i <= 10; i++)
    {
        TableRow fillRow = new TableRow();
        TableCell cellRoleTxt = new TableCell();
        TableCell cellRoleCheck = new TableCell();
        cellRoleTxt.Text = "Titel";
        CheckBox box = new CheckBox();
        box.ID = i.ToString();
        cellRoleCheck.Controls.Add(box);
        fillRow.Controls.Add(cellRoleTxt);
        fillRow.Controls.Add(cellRoleCheck);
        GenTable.Controls.Add(fillRow);
    }
    form1.Controls.Add(GenTable);
}
protected void Button1_Click(object sender, EventArgs e)
{
    List<string> lst = new List<string>();
    FindCheckbox(Page, lst);
}

protected void FindCheckbox(Control enControl, List<string> lst)
{
    foreach (Control ctl in enControl.Controls)
    {
        if(ctl is CheckBox)
        {
            CheckBox box = (CheckBox)ctl;
            if (box.Checked)
                lst.Add(box.ID);
        }
        else
            if(ctl.Controls.Count > 0)
                FindCheckbox(ctl, lst);
    }
}
Avatar billede beef12 Nybegynder
05. december 2006 - 21:13 #13
Copy/paste'r jeg din kode virker det... Jeg ved det ikke så... det er altså underligt. Smid et svar.

Jeg må lede efter hvad hulen der skaber problemet...
Avatar billede beef12 Nybegynder
05. december 2006 - 21:14 #14
Og tak for hjælpen
Avatar billede helmet Nybegynder
05. december 2006 - 21:16 #15
Ok, men jeg vil da egentlig godt lige se hvilket objekt du tilføjer din GenTable til?
Avatar billede beef12 Nybegynder
05. december 2006 - 21:24 #16
TableRows -> TableCells og til sidst checkboxes
Avatar billede beef12 Nybegynder
05. december 2006 - 21:24 #17
GenTable er hardkodet over i html-delen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester