Avatar billede danisher Nybegynder
02. august 2004 - 16:21 Der er 8 kommentarer og
1 løsning

Behandling af tjekboxe

Hej alle

Jeg har en liste checkboxe, som jeg skal vide hvilke er blevet valgt. Deres ID er bleven sat ud fra et unikt ID i en database.

Når så man trykke på Send knappen til sidst, skal jeg så indsætte alle disse ID'er i en anden tabel.

Hvordan gør jeg det nemmest?

Når man trykke på knappen kommer det her frem:
49: on; - 1: on; - 13: on; - 47: on; - 48: on; - _ctl21: Opret; -

Samtidig er VIEWSTATE der også. Teksten overfor er genereret ud fra:
foreach (string s in Request.Form)
{
    error.Text += s + ": " + Request[s] + "; - ";
}

Er der nogen der kan hjælpe?

På forhånd tak!

Mvh
Avatar billede snepnet Nybegynder
02. august 2004 - 17:38 #1
Jeg er lidt usikker på hvad du spørger om her...
Er det omkring den tabel du skal indsætte i du er i tvivl, eller har du tabellen, og er i tvivl om hvordan du får sat værdierne ind.
Eller har det at gøre med at du er i tvivl om måden at hive værdierne af checkboxene ud.

Du må gerne vise lidt mere kode, og måske smide et par kommentarer også.

Er dine checkbokse for øvrigt serverkontroller eller html-kontroller, og hvordan sætter du dem ind på siden ?
Avatar billede danisher Nybegynder
02. august 2004 - 17:42 #2
Hejsa

Ja, kan godt se nu at det er lidt mangelfult... :(

Men først og fremmest, så tror jeg at jeg har fået det til at virke. Det er altsammen code behind, og jeg har så fået sat ckb foran alle ID'erne på checkboxene.

Som beskrevet tidligere, løb jeg alle i form'en igennem, hvilket jeg så gør sådan her nu:
foreach (string s in Request.Form)
{
    if (s.StartsWith("ckb"))
    {
        //smid ind i databasen
    }
}

Derved kan jeg være sikker på at det er en checkbox jeg har med at gøre.

Håber det er i orden jeg diskuterer med mig selv herinde :)
Avatar billede snepnet Nybegynder
02. august 2004 - 17:54 #3
Det er helt iorden, men det er ikke superhensigtsmæssigt det du har gjort.

Hvis det er serverkontroller du benytter, kan du sikre dig at det er den rigtige type ved f.eks.

// hvis du han indsat alle checkboksene f.eks. i et Panel panel
foreach(Control c in panel.Controls)
{
    bool checked = false;
    string id = null;
    if(c is CheckBox)
    {
        checked = ((CheckBex)c).Checked;
        id = ((CheckBex)c).ID;
    }
}

Det bevæger dig også lidt ud på farlig grund, hvis du selv overtager id-generering.
Hvis du gerne vil lade id-et følger kontrollen, ville det nok være federe hvis du stak den en attribut istedet :

CheckBox b = new CheckBox();
b.Attributes["DbId"] = <dit id>;

Så kan du hente sådan her :

foreach(Control c in panel.Controls)
{
    int dbId = 0;
    if(c is CheckBox)
    {
        dbId = int.Parse(((CheckBex)c).Attributes["DbID"]);
    }
}

Mvh
Avatar billede danisher Nybegynder
03. august 2004 - 09:19 #4
Hejsa....

Det ser jo rigtig godt ud. Jeg har nu siddet og rodet med det, men jeg kommer ikke ind i min lykke foreach. Alle checkbox'ene er i en tabel i panelet. Kan det have noget med det at gøre?

Ellers har jeg fået sat noget mere på:
CheckBox cb = new CheckBox();
cb.Attributes["subCategoryID"] = oleDbReader2["id"].ToString();
cb.Attributes["categoryID"] = oleDbReader1["id"].ToString();
cb.Attributes["name"] = oleDbReader2["name"].ToString();

foreach(Control c in newScheme.Controls)
{
    int categoryID = 0;
    int subCategoryID = 0;
    string name;
    if(c is CheckBox)
    {
        categoryID = int.Parse(((CheckBox)c).Attributes["categoryID"]);
        subCategoryID = int.Parse(((CheckBox)c).Attributes["subCategoryID"]);
        name = ((CheckBox)c).Attributes["name"].ToString();
        //Smid ind i databasen    }
}

Men jeg kan ikke få den til at smide noget ind i databasen. For hvis jeg smider en
error.Text += "Test - ";
ind i if-sætningen, kommer der ingenting på skærmen. Ergo, kommer den ikke ind if-sætningen...

Kan du hjælpe?

Takker!
Avatar billede snepnet Nybegynder
03. august 2004 - 09:48 #5
du skal lave din foreach på den kontrol der fungerer som container for dine checkboxe.
har du ikke mulighed for at debugge ?
Avatar billede danisher Nybegynder
03. august 2004 - 09:51 #6
Jo, det har jeg. Bruger VS.NET... Men hvad mener du med det?
Avatar billede danisher Nybegynder
03. august 2004 - 10:01 #7
Hejsa igen!

Jeg fandt ud af det!

Jeg lavede en rekursiv funktion:
kigEfterCheckboxe(Control c);

foreach(Control c in newScheme.Controls)
{
    if (c.Controls.Count > 0)
        kigEfterCheckBoxe(c);
}

foreach (Control c in o.Controls)
{
    if (c.Controls.Count > 0)
        kigEfterCheckBoxe(c);
    int categoryID = 0;
    int subCategoryID = 0;
    string name;
    if (c is CheckBox)
    {
        oleDbConnection1.Open();
        categoryID = int.Parse(((CheckBox)c).Attributes["categoryID"]);
        subCategoryID = int.Parse(((CheckBox)c).Attributes["subCategoryID"]);
        name = ((CheckBox)c).Attributes["name"].ToString();
        //Smid ind i databasen
        oleDbCommand1.ExecuteNonQuery();
        oleDbConnection1.Close();
    }
}

Kan du se det?

Mvh, og tak!
Avatar billede snepnet Nybegynder
03. august 2004 - 10:05 #8
det var bare fordi du skrev at den ikke kom ind i if-sætningen fordi du ikke kunne se noget på skærmen.
Nå... men hvis du debugger - kan du trævle en hvilken som helst kontrol op, og så kan du komme til at se hvor dine checkboxe ligger (altså hvis du har problemer med at finde dem).
Eller kan du også slå trace til... Det kan give dig gode informationer på skærmen.
Avatar billede snepnet Nybegynder
03. august 2004 - 10:06 #9
Hov... mit vindue havde vist ståt åbent lidt for længe der :o)
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