Verkar som om det första inlägget jag gjorde fick nåt spel nånstans, provar igen: Funkar inte. Försökte (efter konvertering till VB, med följande tester) Hittat lösningen. Man måste lägga till en check (TypeOf ) av vilken kontroll man skall kontrollera annars blir det felmeddelanden enligt föregående problemVilka kontroller finns i Placeholder (nytt)
Har ett litet problem
Jag skapar ett antal checkboxar baserat på innehåll i en db.
Sätter namnet för chkboxen till "chkSegment_" och ID för respektive post (chkSegment_1, chkSegment_23)
Det kan komma att ändra sig i den tabell som skall läsa ut vilka checkboxar som skall finns med i formuläret vilket innebär att jag inte på förhand vet vilka ID nummer som kommer att adders till "chkSegment_"
Att skapa dessa i Placeholdern är inga problem:
<code>
mySqlConnection = New SqlConnection(strConString)
mySqlCommand = New SqlCommand("select id_segment, segment from segment where aktiv = 1 order by segment", mySqlConnection)
mySqlConnection.Open()
myReader = mySqlCommand.ExecuteReader()
Dim i As Integer = 0
Do While (myReader.Read())
i += 1
Dim strID_Segment As String = myReader("id_segment")
Dim strSegment As String = myReader("segment")
myCheckbox = New CheckBox()
myCheckbox.ID = "chkSegment_" & strID_Segment
myCheckbox.Text = strSegment
myCheckbox.Checked = False
PlaceHolder.Controls.Add(myCheckbox)
' Om vi har ritat ur 5 kontoller, sätt in en radbrytning
If i Mod 5 = 0 Then
Dim strBreak As New LiteralControl("<br> ")
PlaceHolder.Controls.Add(strBreak)
End If
Loop
</code>
Däremot vet jag inte hur jag skall göra för att loopa ut vilka checkboxar som finns i Placeholdern.
Jag behöver veta vad checkboxarna heter för att kunna ta ut ID (allt förutom "chkSegment_"), för att kunna uppdatera databasen.
Hittade nedanstående kod som används för att kolla om en viss skapad checkbox har Checked satt eller ej.
<code>
Label1.Text = CType(PlaceHolder1.FindControl("chkSegment_1"), CheckBox).Checked.ToString
</code>
Problemet är att då "måste veta" jag ju vad kontrollen heter, skulle vilja ha nånting liknande:
<code>
for each ctl in PlaceHolder
var = CType(PlaceHolder1.FindControl(ctl), CheckBox).Checked.ToString
next
</code>
TIASv: Vilka kontroller finns i Placeholder (nytt)
<code>
foreach(Control ctrl In PlaceHolder.Controls)
{
Response.Write(((ChekcBox)ctrl).Name);
}
</code>Sv: Vilka kontroller finns i Placeholder (nytt)
<code>
Dim ctrl As Control
For Each ctrl In PlaceHolder1.Controls
Label1.Text &= CType(ctrl, CheckBox).ID.ToString()
Next
</code>
Denna genererar följande felkod:
System.NullReferenceException: Object reference not set to an instance of an object.
Felet inträffar på raden som börjar med: Label1.Text
<code>
Dim ctrl As Control
For Each ctrl In PlaceHolder1.Controls
Label1.Text &= "<br>" & CType(PlaceHolder1.FindControl(ctrl.ID), CheckBox).Checked.ToString
Next
</code>
Denna genererar följande felkod:
System.InvalidCastException: Specified cast is not valid.
Felet inträffar på raden som börjar med: Label1.TextSv: Vilka kontroller finns i Placeholder (nytt)
<code>
Dim ctrl As Control
For Each ctrl In PlaceHolder.Controls
' ** Här måste man kontrollera vilken typ av kontroll som man vil kontrollera
If TypeOf ctrl Is CheckBox Then
Label1.Text &= "<br>" & ctrl.ID & " = " & CType(PlaceHolder.FindControl(ctrl.ID), CheckBox).Checked.ToString
End If
Next
</code>