Avatar billede jepjo Nybegynder
10. november 2004 - 19:55 Der er 10 kommentarer og
1 løsning

Bitstreng og Checkboxes

Hej allesammen!

Jeg er ved at lave en side, hvor en bruger kan få lov at vælge diverse indstillinger, til det, har jeg 64 chekboxes, som hver står for en valgbar feature.

Når brugeren forlader siden, gemmes disse i en database, som en bitstreng "100001111000........." 1, for valgte features, og 0 for ikke valgte.

Omvendt, når brugeren igen kommer ind på konfigurationssiden, så skulle jeg gerne have siden til at vise hans opsætning i form af valgte og ikke valgte checkboxes, så han/hun kan ændre konfigurationen med udgangspunkt i den allerede valgte.

hvis jeg opretter 64 checkboxes, er arbejdet noget trivielt, med at sætte de enkelte bits. Desvære har jeg ikke andre ideer end, bare at sige if(checkbox1.Checked)...... indtil 64 -- Øv.

Der må findes en nemere løsning?!

Andet problem, er at det kan være forskelligt antal checkboxes alt efter hvad der skal konfigureres.

Jeg håber nogen har nogle ideer

Mvh

Jesper ;)
Avatar billede arne_v Ekspert
10. november 2004 - 19:56 #1
Lav dine checkboxe som et array af CheckBox og lav en løkke som processer tingene !
Avatar billede arne_v Ekspert
10. november 2004 - 21:08 #2
Eksempel:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace DefaultNamespace
{
    public class MainForm : Form
    {
        private CheckBox[] chkbox;
        private Button calc;
        public MainForm()
        {
            InitializeComponent();
        }
       
        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new MainForm());
        }
       
        private void InitializeComponent() {
            calc = new Button();
            chkbox = new CheckBox[64];
            for(int i = 0; i < chkbox.Length; i++)
            {
                chkbox[i] = new CheckBox();
            }
            SuspendLayout();

            for(int i = 0; i < chkbox.Length; i++)
            {
                chkbox[i].Location = new Point(400 - 50 * (i % 8), 225 - 25 * (i / 8));
                chkbox[i].Text = "bit " + i;
            }

            calc.Location = new Point(50, 300);
            calc.Size = new Size(400, 25);
            calc.Text = "Beregn integer fra bits";
            calc.Click += new EventHandler(CalcClick);

            ClientSize = new Size(500, 350);
            for(int i = 0; i < chkbox.Length; i++)
            {
                Controls.Add(chkbox[i]);
            }
            Controls.Add(calc);
            Text = "Main Form";
            ResumeLayout(false);
        }
        void CalcClick(object sender, EventArgs e)
        {
            long res = 0;
            for(int i = 0; i < chkbox.Length; i++)
            {
                res = 2 * res + (chkbox[63-i].Checked ? 1 : 0);
            }
            MessageBox.Show("Integer = " + res);
        }
    }
}
Avatar billede jepjo Nybegynder
12. november 2004 - 11:59 #3
Hej arne_v!
Du hjalp mig jo også sidst, tak, jeg fik det til at virke uden problemer.

Denne gang mangler jeg nok at skrive at det drejer sig om en aspx side, og at en klasse som den ovenfor går lidt over målet.

Men jeg kan jo lige prøve om jeg ikke bare kan implementere en metode svarende til ovenstående i codebehind.

Foreløbig tak, men jeg er endnu ikke sikker på om det var svaret. Pointene følger når jeg ved mere.
Avatar billede arne_v Ekspert
12. november 2004 - 12:04 #4
Jeg antog winforms. Men en tilsvarend eteknik må kunne anvendes på webforms også.
Avatar billede jepjo Nybegynder
15. november 2004 - 09:13 #5
Efter postback, får jeg compilerfejl, om at nullpointrefference elle sådan noget
Avatar billede jepjo Nybegynder
15. november 2004 - 09:14 #6
string bitrow;
    CheckBox[] cbarray;
    void Page_Load(object sender, System.EventArgs e)
    {
        if(!IsPostBack)
        {
            bitrow = "000000000000000000";
            cbarray = new CheckBox[bitrow.Length];

            for(int i=0;i<cbarray.Length;i++)
            {
                cbarray[i] = new CheckBox();
                // Set the label's Text and ID properties.
                cbarray[i].Text = "item" + i.ToString();
                cbarray[i].ID = "chkbox" + i.ToString();
                cbarray[i].AutoPostBack=true;
                PlaceHolder1.Controls.Add(cbarray[i]);
                // Add a spacer in the form of an HTML <BR> element.
                PlaceHolder1.Controls.Add(new LiteralControl("<br>"));
            }
        }

        for(int i=0;i<cbarray.Length;i++){
            if(cbarray[i].Checked)
                bitrow.Replace(bitrow[i],'1');


        }
        Label1.Text=bitrow;
    }
Avatar billede jepjo Nybegynder
15. november 2004 - 09:16 #7
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Avatar billede arne_v Ekspert
15. november 2004 - 23:17 #8
NullReferenceException må skyldes et eller andet i forbindelse med post back.

Derudover er jeg meget skeptisk overfor den her linie:

bitrow.Replace(bitrow[i],'1');

men det har intet med fejlen at gøre.

Hm. Måske jeg skulle lave min første ASP.NET post back side ...
Avatar billede jepjo Nybegynder
16. november 2004 - 16:38 #9
Tak igen arne_v jeg tror jeg vil oprette nogle flere points til dig i en anden post, men angående din skepsis, så er mit problem, at jeg gerne vil bruge checkboxene til at ændre en konfiguration. Som du sikkert kan se, så er det ikke lige mange checkboxes hver gang, det er afhængig af den konfigurationsstræng der hentes i en db. Først vil jeg altså hente strængen ind, det gør jeg bare med et alm. select til databasen. Udfra strængens længde skal x antal checkboxe genereres og vises på skærmen. Disse skal selvfølgelig være checkecd af i henhold til strængen, checked for 1 og ikke checked ved 0. Dernæst er det brugerens tur, for hver Check eller unCheck, skal den respektive char i strængen skiftes ud, så strængen derefter er en ny, som så kan gemmes som ny konfiguration.

Jeg forstår din skepsis angående bitrow.Replace, det virker nemlig ikke, men det kan være du kan hjælpe. Jeg ved for det første ikke hvordan jeg vedhæfter et metodekald på de renderede checkboxe, sådan at jeg ved CheckedChanged kan kalde en metode der ændrer den respektive char, og udover Replace, har jeg heller ikke rigtig fundet noget som jeg kan bruge til netop dette.

Håber du har tid og lyst til at hjælpe, du er jo tydeligvis lidt sejere end de fleste.
:)
Avatar billede arne_v Ekspert
16. november 2004 - 23:58 #10
Først det nemmeste:

StringBuilder bitrow;
...
bitrow = "000000000000000000";
...
for(int i=0;i<cbarray.Length;i++){
    if(cbarray[i].Checked)
        bitrow[i] = '1';
}
Avatar billede arne_v Ekspert
17. november 2004 - 00:00 #11
post back skal jeg lige tænke lidt mere over
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