21. december 2004 - 12:27Der er
19 kommentarer og 1 løsning
Tilføje til ListBox
Hej,
Jeg har en ListBox hvori der er nogle Items i forvejen, og jeg skal så ved hjælp af en textbox kunne indtaste flere Items. Jeg har bare brug for at tjekke om det jeg indtaster ikke står i listboksen i forvejen.
Jeg har prøvet lidt med en for... each.. -lykke, men kan ikke rigtig få det til at virke. Det skal være noget lignende dette:
Sub BtnTilfoj_Click(sender As Object, e As EventArgs)
Dim boksen as new arraylist(LstBrugerInstr) Dim Item as string
Item = LstBrugerInstr.Items
For each Item in boksen
If txtnytinstr.text = LstBrugerInstr.Items.text Then
response.write("Står der i forvejen!") Else LstBrugerInstr.Items.Insert(0,new ListItem(txtnytinstr.text)) txtNytInstr.text = "" End If
Jeg har prøvet dine metoder i denne for.. each...-løkke. Men den skriver i begge tilfælde at "Value of type 'System.Web.UI.WebControls.ListItem' cannot be converted to 'Boolean'." - Også med FindByValue.
Sub BtnTilfoj_Click(sender As Object, e As EventArgs)
Dim i as integer
For i = 0 to lstBrugerInstr.Items.count - 1 If LstBrugerInstr.Items.FindByText("txtNytInstr.text") Then
response.write("Det indtastede eksisterer i forvejen!") Else LstBrugerInstr.Items.Insert(0,new ListItem(txtnytinstr.text)) End If next txtNytInstr.text = "" End Sub
ahh... FindByX returnerer null hvis det ikke findes... du kan lige se nedenstående eksempel. (hvis det er problematisk at det er i C# må du lige sige til... så skal jeg nok oversætte det).
// bare så vi har lidt at proppe ind i listen NameValueCollection col = new NameValueCollection(); col.Add("hej","1"); col.Add("med","2"); col.Add("dig","3");
// en ny dropdownliste her DropDownList ddlist = new DropDownList(); // datakilden sættes ddlist.DataSource = col; // og der databindes ddlist.DataBind();
// der spørges på en bestemt værdi, og hvis den ikke er der indsættes den. if(ddlist.Items.FindByValue("4") == null) ddlist.Items.Add(new ListItem("du","4"));
// der spørges på en bestemt værdi, og hvis den ikke er der indsættes den. if(ddlist.Items.FindByValue("4") == null) ddlist.Items.Add(new ListItem("du","4")); else Response.Write("Det indtastede eksisterer i forvejen!");
Else response.write("Det indtastede eksisterer i forvejen!") End If next txtNytInstr.text = "" End Sub
- Der er så lige det lille problem at skriver jeg "DU" i stedet for "du", så indsætter den det alligevel. Hvordan klarer jeg det med UpperCase og LowerCase?
Måske noget i denne stile (jeg er ikke så skrap til VB) :
Sub BtnTilfoj_Click(sender As Object, e As EventArgs) If LstBrugerInstr.Items.Count < 1 or LstBrugerInstr.Items.FindbyValue(txtNytInstr.text.ToUpper()) is Nothing Then LstBrugerInstr.Items.Insert(0,new ListItem(txtnytinstr.text.ToUpper())) Else response.write("Det indtastede eksisterer i forvejen!") End If next txtNytInstr.text = "" End Sub
Tak for det sidste der, jeg tror jeg kan få det til at virke, men lige nu sidder jeg og bøvler med at der ikke bliver sat noget fra min text-box "TxtNytInstr" ind i Listboxen "LstBrugerInstr" - Det er som om den sætter 0-værdien ind i stedet for teksten ved denne linie:
hov.... hvis tingende skal hænge sammen skal du nok bruge FindByText i det jeg skrev. (går ud fra at det er det der står i teksboksen du vil have vist i listen :o)
er der noget sted i koden du skriver noget i tekstboksen ? og har du prøvet at debugge dig ned igennem koden ?
Hej, jeg har også forsøgt med FindByValue, men det er som om den ikke vil indsætte teksten - kun value'n. Det er vel noget med at "value" og "text" behandles forskelligt.
Jeg har lige lavet et eksempel her, med den kode der har været tættest på at virke:
Du har ikke angivet at du ønsker at bruge din metode til at håndtere click-eventet på din knap (onclick="BtnTilfoj_Click"). Og - løkken er stadig ikke nødvendig... prøv sådan her :
// din knap i aspx-en <asp:Button id="BtnTilfoj" runat="server" Text="Tilføj" onclick="BtnTilfoj_Click"></asp:Button>
// og din metode : Sub BtnTilfoj_Click(sender As Object, e As EventArgs) If LstBrugerInstr.Items.FindbyText(txtNytInstr.text) is Nothing Then LstBrugerInstr.Items.Insert(0,new ListItem(txtnytinstr.text)) txtNytInstr.text = "" Else LblfejlNytinstr.text = "Det indtastede findes allerede i din liste!" End If End Sub
Jeg kan godt se at den løkke ikke var nødvendig, men til at starte med var det fordi jeg ville have løkken til at generere en streng med hvert Item sepereret af komma; som jeg så kunne indsætte i en database med SQL.
Du må gerne lægge et svar, men hvis du har et hurtigt bud på hvordan man kan bruge løkken til at lave sådan en tekststreng må du gerne komme med det. Du får selvfølgelig ekstra point :-)
hvad med sådan noget her ? (man kan ikke lave en for each over en collection der modificeres undervejs... det giver dig en runtime fejl).
Sub BtnTilfoj_Click(sender As Object, e As EventArgs) If LstBrugerInstr.Items.FindbyText(txtNytInstr.text) is Nothing Then LstBrugerInstr.Items.Insert(0,new ListItem(txtnytinstr.text)) txtNytInstr.text = "" Else LblfejlNytinstr.text = "Det indtastede findes allerede i din liste!" End If
Dim strItems as String = nothing for each li as ListItem in LstBrugerInstr.Items strItems = strItems & li.Text & "," next if not strItems is nothing 'fjerne bare det sidste komma strItems = strItems.Remove(strItems.Length - 1, 1) end if Response.Write (strItems) End Sub
Ja, det er meget perfekt! "Li" skulle lige defineres i starten i stedet for "as listItem inde i for-sætningen for at det ville køre, men ellers fint sådan her:
Dim strItems as String = nothing Dim li as ListItem
for each li in LstBrugerInstr.Items strItems = strItems & li.Text & ", " next if not strItems is nothing 'fjerner bare det sidste komma strItems = strItems.Remove(strItems.Length - 1, 1) end if Response.Write(strItems) End Sub
Men den fjerner godt nok ikke det sidste komma, selvom den burde, men ellers holder det vand! :-)
Sub BtnTilfoj_Click(sender As Object, e As EventArgs) If LstBrugerInstr.Items.FindbyText(txtNytInstr.text) is Nothing Then LstBrugerInstr.Items.Insert(0,new ListItem(txtnytinstr.text)) txtNytInstr.text = "" Else LblfejlNytinstr.text = "Det indtastede findes allerede i din liste!" End If
Dim strItems as String = nothing for each li as ListItem in LstBrugerInstr.Items strItems = strItems & li.Text & "," next if not strItems is nothing strItems = strItems.Remove(strItems.Length - 1, 1) end if Response.Write (strItems) End Sub
</script> <html> <head> </head> <body> <form runat="server"> <p> <asp:ListBox id="LstBrugerInstr" runat="server" Height="300px" Width="150px"> <asp:ListItem Value="En ting">En ting</asp:ListItem> <asp:ListItem Value="En anden ting">En anden ting</asp:ListItem> </asp:ListBox> </p> <p> Skriv her det der skal tilføjes:<br /> <asp:TextBox id="TxtNytInstr" runat="server"></asp:TextBox> <br /> <br /> <asp:Label id="LblFejlNytInstr" runat="server" forecolor="Red"></asp:Label> </p> <p> <asp:Button id="BtnTilfoj" onclick="BtnTilfoj_Click" runat="server" Text="Tilføj"></asp:Button> </p> </form> </body> </html>
bare prøv at paste den direkte ind... det ville være lidt underligt hvis det ikke fungerede hos dig synes jeg.
Ahh.. Det var så fordi jeg havde lavet dit kommaseperationsfelt om fra "," til ", " - derfor krævede (strItems.Length - 1, 1) længere nede at blive lavet om til (strItems.Length - 2, 1) Så nu må det siges at virke perfekt! (- Selvfølgelig også kun en detalje med det komma!)
Men du skal have mange tak for den store hjælp denne gang! :-D
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.