30. september 2004 - 11:25Der er
47 kommentarer og 1 løsning
Indsæt en <asp:radiobuttonlist i vb.net
Jeg har følgende problem: Jeg vil gerne i VB kode lave en asp:radiobuttonlist/asp:checkboxlist
Pt. har jeg følgende kode hardcoded: <asp:RadioButtonList id='rbList' runat='server'></asp:RadioButtonList>
Og så tilføjer jeg listepunkter i VB på følgende måde: rbList.Items.Add(New ListItem("test", "T")) osv.
MEN da jeg på bagrund af data vil lave ENTEN en CheckBoxList eller en RadioButtonList og ikke ved dette på forhånd har jeg brug for også at lave <asp:xxxList> tagget dynamisk. Kan jeg det?
På siden skal der listes op til 5 forskellige lister med et differencerende antal punkter, og alle lister skal jo afsluttes korrekt. (</asp:XXXXXlist>), derfor løber jeg for hurtigt tør for muligheder i en repeater og har brug for at kunne scripte hele siden...
Public Class RadioButtons Inherits System.Web.UI.Page Protected Form1 As HtmlForm
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim rbList As RadioButtonList = New RadioButtonList () rbList.Items.Add("hej") rbList.Items.Add("med") rbList.Items.Add("dig") Form1.Controls.Add(rbList) End Sub
Protected Overloads Overrides Sub OnInit(ByVal e As EventArgs) InitializeComponent() MyBase.OnInit(e) End Sub
Private Sub InitializeComponent() AddHandler Me.Load, AddressOf Me.Page_Load End Sub End Class End Namespace
Det kan jo ikke bruges til det helt store, men listen er i hvert fald oprettet dynamisk, og det er jo en start. vi bygger bare videre indtil du har noget du kan bruge.
Kunne du udvide eksemplet med et array af Navne på Radiobuttonlist's og CheckBoxlist og derefter et loop der laver flere af disse lister efter hinanden.
Var det sådan noget i den her stil du mente ? (tag dig ikke af alt pladderet med stringgymnastikken... jeg skulle bare lige simulere en eller anden ressource der skulle genereres lister over... håber ikke det forstyrrer for meget).
Public Class RadioButtons Inherits System.Web.UI.Page Protected Form1 As HtmlForm Private Const konfiguration As String = "CheckBoxList:hej,med,dig;RadioButtonList:hej,med,dig;CheckBoxList:hej,med,dig"
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim lister As String = konfiguration.Split(";"C) For Each liste As String In lister Dim resource As String = liste.Split(":"C) Dim type As String = resource(0) Dim names As String = resource(1).Split(","C) Select type Case "CheckBoxList" Form1.Controls.Add(GetRadioButtonList(names)) ' break Case "RadioButtonList" Form1.Controls.Add(GetCheckBoxList(names)) ' break Case Else Throw New ApplicationException ("Kunne ikke udlede typen") End Select Next End Sub
Protected Function GetRadioButtonList(ByVal names() As String) As RadioButtonList Dim rblist As RadioButtonList = New RadioButtonList () For Each name As String In names rblist.Items.Add(name) Next Return rblist End Function
Protected Function GetCheckBoxList(ByVal names() As String) As CheckBoxList Dim cblist As CheckBoxList = New CheckBoxList () For Each name As String In names cblist.Items.Add(name) Next Return cblist End Function
Protected Overloads Overrides Sub OnInit(ByVal e As EventArgs) InitializeComponent() MyBase.OnInit(e) End Sub
Private Sub InitializeComponent() AddHandler Me.Load, AddressOf Me.Page_Load End Sub End Class End Namespace
Jeg syntes du har lavet et meget flot stykke arb. her!! Jeg har nu siddet et par timer og prøvet at bikse det på plads med den datakilde jeg har, men jeg kan ikke få det til at spille.
Jeg hælder gerne nogle flere point på hvis du kan give et lille håndsrækning mere...
Min datakilde er en datatable der ser ud som følger: type listetype name default 2 0 test1 0 1 0 test1_1 0 1 0 test1_2 1 2 1 test2 0 1 1 test2_1 1 1 1 test2_2 0 osv.
Type fortæller om det er en gruppe/lister eller en item (2=liste og 1=item) Listetype fortæller om det er checkbox eller radio (0 = radio) Name giver sig selv ;-) default angiver hvilket punkt på listen der skal være valgt initielt
Giver det mening? Det håber jeg... Du får 200 xtra point for denne...
sorry.... sidder også og laver lidt andre småting... du kan lige få noget værre gnidder her... det virker muligvis :) (men det er da tro imod datakilden... men så skal den også være tro mod det du skrev ;o)
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
namespace EXP2 { public class RadioButtons : System.Web.UI.Page { protected HtmlForm Form1;
// en dummyressource private const string konfiguration = "CheckBoxList:hej,med,dig;RadioButtonList:hej,med,dig;CheckBoxList:hej,med,dig";
foreach(string liste in lister) { string[] resource = liste.Split(':'); string type = resource[0]; string[] names = resource[1].Split(',');
switch(type) { case "CheckBoxList" : Form1.Controls.Add(GetRadioButtonList(names)); break; case "RadioButtonList" : Form1.Controls.Add(GetCheckBoxList(names)); break; default : throw new ApplicationException("Kunne ikke udlede typen");
} } }
protected RadioButtonList GetRadioButtonList(string[] names) { RadioButtonList rblist = new RadioButtonList(); foreach(string name in names) { rblist.Items.Add(GetListItem(name)); } return rblist; }
protected CheckBoxList GetCheckBoxList(string[] names) { CheckBoxList cblist = new CheckBoxList(); foreach(string name in names) { cblist.Items.Add(GetListItem(name)); } return cblist; }
protected DataTable CreateDataSource() { // først tabellen DataTable dt = new DataTable("dummydata"); dt.Columns.Add("type", typeof(int)); dt.Columns.Add("listetype", typeof(int)); dt.Columns.Add("name", typeof(string)); dt.Columns.Add("default", typeof(int));
// så lidt dummydata DataRow newRow = dt.NewRow();
(det er lidt klamt hvis jeg selv skal sige det... men begge liste har basen i ListControl, som ikke implementerer .Items, og som for øvrigt er abstrakt - og det ødelægger lidt muligheden for at slippe for det listespecifikke kode.
Public Class RadioButtons Inherits System.Web.UI.Page Protected Form1 As HtmlForm Private Const konfiguration As String = "CheckBoxList:hej,med,dig;RadioButtonList:hej,med,dig;CheckBoxList:hej,med,dig"
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) InsertListsModelTwo() End Sub
Protected Sub InsertListsModelTwo() Dim dt As DataTable = CreateDataSource() Dim rbliste As RadioButtonList = Nothing Dim cbliste As CheckBoxList = Nothing Dim type As Integer Dim lasttype As Integer = 0 Dim listetype As Integer = 0 Dim lastlistetype As Integer = 0 For Each dr As DataRow In dt.Rows type = CType(dr("type"), Integer) If type = 2 Then listetype = CType(dr("listetype"), Integer) If lasttype = 1 Then If lastlistetype = 0 Then Form1.Controls.Add(rbliste) rbliste = Nothing Else If lastlistetype = 1 Then Form1.Controls.Add(cbliste) cbliste = Nothing End If End If End If If listetype = 0 Then rbliste = New RadioButtonList () rbliste.Items.Add(GetListItem(dr("name").ToString())) Else If listetype = 1 Then cbliste = New CheckBoxList () cbliste.Items.Add(GetListItem(dr("name").ToString())) End If End If lastlistetype = listetype Else If type = 1 Then If lastlistetype = 0 Then rbliste.Items.Add(GetListItem(dr("name").ToString())) Else If lastlistetype = 1 Then cbliste.Items.Add(GetListItem(dr("name").ToString())) End If End If End If End If lasttype = type Next If Not (rbliste Is Nothing) Then Form1.Controls.Add(rbliste) End If If Not (cbliste Is Nothing) Then Form1.Controls.Add(cbliste) End If End Sub
Protected Function GetListItem(ByVal name As String) As ListItem Return New ListItem (name) End Function
Protected Sub InserListsModelOne() Dim lister As String = konfiguration.Split(";"C) For Each liste As String In lister Dim resource As String = liste.Split(":"C) Dim type As String = resource(0) Dim names As String = resource(1).Split(","C) Select type Case "CheckBoxList" Form1.Controls.Add(GetRadioButtonList(names)) ' break Case "RadioButtonList" Form1.Controls.Add(GetCheckBoxList(names)) ' break Case Else Throw New ApplicationException ("Kunne ikke udlede typen") End Select Next End Sub
Protected Function GetRadioButtonList(ByVal names() As String) As RadioButtonList Dim rblist As RadioButtonList = New RadioButtonList () For Each name As String In names rblist.Items.Add(GetListItem(name)) Next Return rblist End Function
Protected Function GetCheckBoxList(ByVal names() As String) As CheckBoxList Dim cblist As CheckBoxList = New CheckBoxList () For Each name As String In names cblist.Items.Add(GetListItem(name)) Next Return cblist End Function
Har blot et lille problem med at fange værdierne fra checkboksene. Jeg har prøvet med en Request.Form og RadioButton værdierne kommer fint ind.
Jeg tildeler attributer og værdier på følgende måde:
Protected Function GetListItem(ByVal name As String, ByVal stdDefault As Integer, ByVal ItemQuantity_per As Integer, ByVal description As String, Optional ByVal locked As Integer = 0) As ListItem Dim x As New ListItem(name) x.Selected = (1 = stdDefault) x.Text = description x.Value = ItemQuantity_per Return x End Function
Nu har vi jo klasket det hele ind i Form1-kontrollen, så du kan også finde dem der igen.
har du angivet f.eks. ID="testid" på en kontrol som du har smidt ind på Fomr1 - burde du kunne finde den igen med Form1.FindControl("<kontrolid>");
men du kan og traversere igennem kontroltræet med foreach(Control c in Form1.Controls) { if(c is CheckBoxList) { CheckBoxList cbl = (CheckBoxList)c; } }
Det er helt fint! Det du viser her er godt, så langt så godt. Som jeg ser det kan jeg nu identificere og udvælge de rigtige controller (Checkboxlist), så mangler jeg bare at kunne loope gennem elementerne i controllen og udvælge dem der er Selected.
Jeg har oprettet et nyt spg. til denne fortsættelse. Hvis du svarer videre på den kan jeg give nogle flere point. ;-)
På Radiobuttonlist eller Checkboxlist er det muligt at tilføje en OnSelectedIndexChanged attribut men jeg kan ikke umiddelbart komme til at tilføje den når jeg opretter listerne dynamisk??
// en liste CheckBoxList cbl = new CheckBoxList(); // abbonner på eventet cbl.SelectedIndexChanged += new EventHandler(cbl_SelectedIndexChanged);
// og handlere bliver så noget i denne stil : private void cbl_SelectedIndexChanged(object sender, EventArgs e) { // her kan du så gøre noget ved det :o) }
Æhh... på VB'sk skal du nok bare oprette en metode som denne her istedet :
Private Sub cbl_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbl.SelectedIndexChanged End Sub
og så skal du nok angive når du opretter den, at den skal være withevents sådan her : Protected WithEvents cbl As System.Web.UI.WebControls.CheckBoxList
øv øv Jeg kan ikke få den til at virke :-( Den fejler ikke, men gør heller ingen verdens ting.
Jeg har lavet følgende:
Protected WithEvents cbliste As CheckBoxList cbliste = New CheckBoxList() Private Sub cbliste_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbliste.SelectedIndexChanged Label1.Text = "test" End Sub
Arh... man skal lave en lille besværgelse til (jeg er som sagt sinke til VB).
du kan lige se et eksemple her :
Public Class WebForm1 Inherits System.Web.UI.Page
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init InitializeComponent() End Sub
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim CheckBoxList1 As New System.Web.UI.WebControls.CheckBoxList CheckBoxList1.Items.Add("hej") CheckBoxList1.Items.Add("med") CheckBoxList1.Items.Add("dig") AddHandler CheckBoxList1.SelectedIndexChanged, AddressOf CheckBoxList1_SelectedIndexChanged1 Me.Controls(1).Controls.Add(CheckBoxList1) 'og lige en knap så vi kan lave et postback Me.Controls(1).Controls.Add(New Button) End Sub
Private Sub CheckBoxList1_SelectedIndexChanged1(ByVal sender As System.Object, ByVal e As System.EventArgs) Response.Write("test") End Sub End Class
Det virker hvadenten autopostback er true eller false på CheckBoxList'en.
Det giver slet ikke nogen mening... jeg har det kørende her helt uden problemer... der må være noget vi miskommunikerer over ?!? er det du savner at der sker et postback med det samme man klikker i en af checkboksene - eller kan du ikke få handleren kaldt på nogen som helst måde ?
// autopostback = true kan du sætte på flere typer af kontroller, ved en checkbox bevirker det at der laves postback når der klikkes i boksen, og ved en tekstboks kan det ske når man ændrer i den og forlader feltet.
hvis du har autopostback=false skal der så være noget andet på siden der sørger for at der sker et postback (derfor knappen i eksemplet).
hvad enten postback'et eksekveres ved at der klikkes i en checkboxlist, hvor autopostback=true, eller ved en hvilken som helst anden kontrol (en knap, eller andre kontroller der kan generere et postback) - skal handleres køres på serveren.
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.