10. november 2004 - 19:55Der 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.
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); } } }
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>")); } }
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.
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. :)
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.