:Francis: Skrevet 24. april 2009 Del Skrevet 24. april 2009 (endret) Jeg holder på å lage et simpelt "handlekurvsystem" som en del av et større system. Formålet med "handlekurven" er at den skal vise valgte elementer og la brukeren legge til og fjerne elementer ved behov. Koden fungerer fotreffelig, med unntak av DropDownList.SelectedIndex som til en hver tid returnerer 0. Jeg bruker listen til å velge elementet som skal fjernes. Er det noen som har peiling på hvorfor den ikke returnerer riktig verdi? Jeg har gjort det samme før i både windows forms og med ASP uten at det har bydd på problemer. protected void Page_Load(object sender, EventArgs e) { if (!Page.IsCallback) { tempList.Add("doc1"); tempList.Add("doc2"); tempList.Add("doc3"); tempList.Add("doc4"); tempList.Add("doc5"); tempList.Add("doc6"); printSelectedDocs(tempList); } } private void printSelectedDocs(List<string> selectedDocs) { string docString = null; removeDocumentDropDownList.Items.Clear(); removeDocumentDropDownList.Items.Add("**SELECT**"); for (int i = 0; i < selectedDocs.Count; i++) { docString += selectedDocs[i] + "\n"; ListItem lstItem = new ListItem(selectedDocs[i].ToString()); removeDocumentDropDownList.Items.Add(selectedDocs[i]); } selectedDocsTextBox.Text = docString; } protected void removeDocumentButton_Click(object sender, EventArgs e) { int selectedDocNr = removeDocumentDropDownList.SelectedIndex; if (selectedDocNr > 0) { tempList.RemoveAt(selectedDocNr); } printSelectedDocs(tempList); } <asp:DropDownList ID="removeDocumentDropDownList" runat="server"> </asp:DropDownList> <asp:Button ID="removeDocumentButton" runat="server" CausesValidation="False" onclick="removeDocumentButton_Click" Text="Remove Document" /> Setter stor pris på all hjelp! Mvh Francis EDIT: tempList skal ikke populeres slik den gjør nå. Jeg har simpelthen lagt til "dummy data" for testing. Endret 24. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 Hvordan populerer du tempList på postbacks? Hva er tempList? Lenke til kommentar
:Francis: Skrevet 24. april 2009 Forfatter Del Skrevet 24. april 2009 tempList er en List: private List<string> tempList = new List<string>(); tempList populeres bare første gang siden lastes, men elementer fjernes ved å kjøre removeDocumentButton_Click() Mvh Francis Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 (endret) Prøv if (!Page.IsPostBack) ..du. Og: removeDocumentDropDownList.Items.Add(lstItem); Debugge, vet du. Edit: Siste linja der er mer kosmetisk, men når du først har opprettet et ListItem-objekt, så.. Endret 24. april 2009 av Trondster Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 Hvordan populerer du tempList på postbacks? Hva er tempList? ..Og når du nå har løst det første problemet, så du ikke lenger nuker removeDocumentDropDownList ved hver postback, så får du problemer med det jeg kommenterer over - hvordan skal tempList ha noen verdier på postbacks, når du hverken lagrer den i sesjonen, user controls eller i viewstate? Generelt bør man unngå bruk av sesjon, med mindre det er en kontekst, som brukerlogin/handlekurv, eller det er store ting som uploadede filer og sånt. Her kan en handlekurv kanskje gjemmes i sesjonen. Lenke til kommentar
:Francis: Skrevet 24. april 2009 Forfatter Del Skrevet 24. april 2009 (endret) Jeg er ikke helt sikker på om vi forstår hverandre (det er meget sannsynlig at jeg er feilkilden). gjør jeg slik: protected void removeDocumentButton_Click(object sender, EventArgs e) { int selectedDocNr = 4; //removeDocumentDropDownList.SelectedIndex; if (selectedDocNr > 0) { tempList.RemoveAt(selectedDocNr); } printSelectedDocs(tempList); } Og trykker på knappen, så slettes element 4, og siden repopuleres med de riktige verdiene. Problemet mitt er at removeDocumentDropDownList.SelectedIndex; returnerer 0 uansett hva som er valgt i removeDocumentDropDownList. Til sammenligning bruker jeg .Text på DropDownList i andre klasser uten problemer - som i SQL spørringen du oppfordret meg til å parametisere for å unngå injection. Beklager hvis jeg er utrolig treg nå :/ Mvh Francis Endret 24. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 Prøv if (!Page.IsPostBack) ..du. Les linjen over. Igjen. ..Og endre if-testen din til det som står der. If-testen din slår nemlig til hver postback. ..Og så kan du lese den andre posten min. Lenke til kommentar
:Francis: Skrevet 24. april 2009 Forfatter Del Skrevet 24. april 2009 (endret) Nå føler jeg meg passe teit. Jeg leste: if (!Page.IsCallback) I koden min som: if (!Page.IsPostBack) Og kunne ikke skjønne hvorfor du foreslo noe jeg allerede hadde gjort - my bad! Nå er listen min tom, slik du beskrev det kom til å skje, så jeg får rydde opp i det etter at jeg har skjønt 100% hvorfor den tømmes. Tusen takk for hjelpa! Mvh Francis Endret 24. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 Nå er listen min tom, slik du beskrev det kom til å skje, så jeg får rydde opp i det etter at jeg har skjønt 100% hvorfor den tømmes. Koden din kjører "fra start" hver postback - lokale variabler, som tmpList, blir derfor instansiert på nytt. Får de ingen verdi, så har de ingen verdi. Du kan f.eks. stappe den i viewstaten på siden eller i sesjonen. Så kan du lese den igjen derfra. Klassiker: (Bare knastret inn, ikke kompilert) private List<string> m_Foo = null; private List<string> Foo { get { if (m_Foo == null) { m_Foo = Session["MyFooList"]; if (m_Foo == null) { m_Foo = new List<string>(); Session["MyFooList"] = m_Foo; } } return m_Foo; } } ..Og så bruker du bare Foo i koden din når du skal ha listen. Potensielt kan det være et thread-issue der, men det gadde jeg ikke kikke på i denne sammenhengen. Lenke til kommentar
:Francis: Skrevet 24. april 2009 Forfatter Del Skrevet 24. april 2009 (endret) Jeg vil helst slippe å dra session inn i dette hvis jeg kan unngå det. Kommer jeg til helvete hvis jeg løser det slik?: private void printSelectedDocs(List<string> selectedDocs) { string docString = null; for (int i = 0; i < selectedDocs.Count; i++) { if (selectedDocs[i] != "**SELECT**") { docString += selectedDocs[i] + "\n"; } ListItem lstItem = new ListItem(selectedDocs[i].ToString()); removeDocumentDropDownList.Items.Add(selectedDocs[i]); } selectedDocsTextBox.Text = docString; } protected void removeDocumentButton_Click(object sender, EventArgs e) { int counter = removeDocumentDropDownList.Items.Count; for (int i = 0; i < counter; i++) { tempList.Add(removeDocumentDropDownList.Items[i].ToString()); } int selectedDocNr = removeDocumentDropDownList.SelectedIndex; if (selectedDocNr > 0) { tempList.RemoveAt(selectedDocNr); } removeDocumentDropDownList.Items.Clear(); printSelectedDocs(tempList); } Endret 24. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 Har du vurdert protected void removeDocumentButton_Click(object sender, EventArgs e) { removeDocumentDropDownList.Items.RemoveAt(removeDocumentDropDownList.SelectedIndex); } ? Lenke til kommentar
:Francis: Skrevet 24. april 2009 Forfatter Del Skrevet 24. april 2009 (endret) Nei, den tanken har ikke streifet meg, men selv om jeg gjør det må texboksen fortsatt oppdateres med det nye innholdet til DropDownListen. Francis Endret 24. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 ..men så bare bruk dropdown-listen til å lagre dataene dine i. protected void removeDocumentButton_Click(object sender, EventArgs e) { removeDocumentDropDownList.Items.RemoveAt(removeDocumentDropDownList.SelectedIndex); printSelectedDocs() } private void printSelectedDocs() { string docString = ""; foreach (ListItem li in removeDocumentDropDownList.Items) { if (li.Value != "**SELECT**") { docString += li.Value + "\n"; } } selectedDocsTextBox.Text = docString; } Lenke til kommentar
:Francis: Skrevet 24. april 2009 Forfatter Del Skrevet 24. april 2009 (endret) Pwnage som det holder! Det jeg brukte en hel dag på brukte du et par min på Tusen hjertelig takk for all hjelp! Mvh Francis Endret 24. april 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 24. april 2009 Del Skrevet 24. april 2009 Du vil ikke vite hva jeg normalt tar i timepris.. Legg også på en if(removeDocumentDropDownList.SelectedIndex>0) på første linje i removeDocumentButton_Click(), så du ikke fjerner **SELECT**-elementet. Lenke til kommentar
:Francis: Skrevet 25. april 2009 Forfatter Del Skrevet 25. april 2009 Takk igjen! Det var lurt å bruke foreach i printSelectedDocs - mye smidigere enn det jeg hadde gjort! Jeg har tidligere kun brukt foreach sammen med en eller flere delimiters for å splite strenger på bestemte chars. Jeg ser på det som en viktig del av læringsprosessen å bli korrigert slik. På den måten åpner man øynene opp for andre og bedre måter å løse samme problem på, og man kan ta med seg erfaringene videre og bygge på de. Mvh Francis Lenke til kommentar
Trondster Skrevet 25. april 2009 Del Skrevet 25. april 2009 Takk igjen! Det var lurt å bruke foreach i printSelectedDocs - mye smidigere enn det jeg hadde gjort! Jeg har tidligere kun brukt foreach sammen med en eller flere delimiters for å splite strenger på bestemte chars. Jeg ser på det som en viktig del av læringsprosessen å bli korrigert slik. På den måten åpner man øynene opp for andre og bedre måter å løse samme problem på, og man kan ta med seg erfaringene videre og bygge på de. Mvh Francis Helt klart viktig å lære hva som finnes i libraries, runtimesystemet, best practices og sånt. Erfaring kommer nok. Ellers: Skal du splitte strenger - ikke bruk foreach - bruk heller string.Split(). string foo = (...); string[] fooSplit = foo.Split(' ', '/t', '/r', '/n'); Split er en funksjon som tar "params" - dvs uendelig antall videre parametre. Penere enn foo.Split(new char[] = {' ', '/t', '/r', '/n'}); og lignende.. Lykke til videre! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå