Avatar billede sbi Nybegynder
08. oktober 2004 - 22:10 Der er 9 kommentarer og
1 løsning

Syntaks fejl ved Autopostback script

Når jeg laver en Autopostback på en Checkboxlist, genereres et client javascript.

cbliste.AutoPostBack = True

Men når jeg laver denne i en block (.ascx) laver den kuk i syntaksen og dette giver en fejl i browseren.

theform = document.forms["BuilderBlock:Form1"];

Den brokker sig over ":" tegnet.

Hvis jeg laver det samme på en (.aspx) page laver den en syntax uden fejl:

theform = document.forms["Form1"];

Hvad kan man gøre ved det?
Avatar billede snepnet Nybegynder
08. oktober 2004 - 22:28 #1
hej igen sbj :o)

hvis du laver en usercontrol med denne code-behind :

Public Class SomeControl
    Inherits System.Web.UI.UserControl

#Region " Web Form Designer Generated Code "

    <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

#End Region

    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")
        CheckBoxList1.AutoPostBack = True
        AddHandler CheckBoxList1.SelectedIndexChanged, AddressOf CheckBoxList1_SelectedIndexChanged1
        Controls.Add(CheckBoxList1)
        'og lige en knap så vi kan lave et postback
        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

Observerer du så også fejlen, hvis du bare trækker den ind på en normal form ?
(det skulle ikke særlig gerne være tilfældet)

mvh
Avatar billede snepnet Nybegynder
08. oktober 2004 - 22:29 #2
Jeg vil gerne se din aspx-kode på den form hvor du har indsat kontrollen (altså din UserControl).
Avatar billede cbp Nybegynder
08. oktober 2004 - 22:56 #3
Det er en bug i .Net 1.1. Opdater med Service Pack 1 til .Net 1.1 (http://www.microsoft.com/downloads/details.aspx?FamilyID=A8F5654F-088E-40B2-BBDB-A83353618B38&displaylang=en) og problemet er løst.
Avatar billede snepnet Nybegynder
08. oktober 2004 - 23:25 #4
sbj... bruger du en eller anden form for masterpages, eller har du af andre grunde en form på din usercontrol ?
det ser umiddelbart sådan ud på det du får genereret (altså BuilderBlock:Form1)...

hvis det er tilfældet fikser servicepakken det sikkert som cbp skriver.
jeg synes godt nok ikke lige det sådan umiddelbart fremgår af listen over fixes der er inkluderet i pakken, men der har tidligere været en hotfix ude omkring det.

cbp>> har du links til sider, hvor det fremgår at buggen er fikset i servicepakken ?
(eller er det bare mig der har overset det på listen, og måske skulle spørge dig om links til gode optikere istededet ?)

mvh
Avatar billede snepnet Nybegynder
08. oktober 2004 - 23:29 #5
Arh... der var den jo :o)
http://support.microsoft.com/default.aspx?kbid=818803
der linkes til den fra
818803 Post-RTM .NET Framework 1.1 ASP.NET hotfix package symptoms
på siden med listen over ting i servicepakken
Avatar billede sbi Nybegynder
09. oktober 2004 - 01:12 #6
Ja, det var det der skulle til for at rette denne fejl.
Men efter opdateringen er den begyndt at lave noget mærkeligt, den kopiere/laver flere af samme listeitems hver gang jeg aktiverer autopostback.

Se min kode her:

Protected Form1 As HtmlForm = New HtmlForm()
    Protected WithEvents Button1 As System.Web.UI.WebControls.Button
    Protected WithEvents Label1 As System.Web.UI.WebControls.Label
    Protected cbliste As New System.Web.UI.WebControls.CheckBoxList()
    Protected rbliste As New System.Web.UI.WebControls.RadioButtonList()

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    'End Sub


    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        InsertListsModelTwo()
    End Sub

    Protected Sub InsertListsModelTwo()
        Dim dt As DataTable = CreateDataSource()
        Dim Singlebtn As RadioButton = Nothing
        Dim GroupLabel As Label = Nothing
        Dim HtmlWrite As HtmlTextWriterTag = Nothing
        Dim type As Integer
        Dim lasttype As Integer = 0
        Dim listetype As Integer = 0
        Dim lastlistetype As Integer = 0
        Dim dr As DataRow
        Dim tmpNo As String
        Dim stdDefault As Integer
        Dim ItemDesc As String
        Dim ItemQuantity_per As Integer

        For Each dr In dt.Rows
            tmpNo = dr("No")
            stdDefault = dr("defaultItem")
            type = CType(dr("type"), Integer)
            ItemDesc = dr("description")
            ItemQuantity_per = dr("Quantity_per")

            If type = 2 Then
                listetype = CType(dr("ChoiceType"), Integer)
                'Laver afslutning til grupper
                If lasttype = 1 Then
                    If lastlistetype = 0 Then
                        Form1.Controls.Add(rbliste)
                        rbliste = Nothing
                    ElseIf lastlistetype = 1 Then
                        Form1.Controls.Add(cbliste)
                        cbliste = Nothing
                    End If
                End If
                '/Laver afslutning til grupper
                'Laver Ny gruppeListe og Label
                If listetype = 0 Then
                    rbliste = New RadioButtonList()
                    AddHandler rbliste.SelectedIndexChanged, AddressOf cbliste_SelectedIndexChanged1
                    Me.Controls(1).Controls.Add(rbliste)
                    'Me.Controls(1).Controls.Add(New Button())
                    rbliste.AutoPostBack = True
                    'Me.Controls(1).Controls.Add(GetGroupLabel(tmpNo))
                ElseIf listetype = 1 Then
                    cbliste = New CheckBoxList()
                    AddHandler cbliste.SelectedIndexChanged, AddressOf cbliste_SelectedIndexChanged1
                    Me.Controls(1).Controls.Add(cbliste)
                    'Me.Controls(1).Controls.Add(New Button())
                    cbliste.AutoPostBack = True
                    ' Me.Controls(1).Controls.Add(GetGroupLabel(tmpNo))
                ElseIf listetype = 2 Then
                    Form1.Controls.Add(GetGroupLabel(tmpNo))
                End If
                '/Laver Ny gruppeListe og Label
                lastlistetype = listetype
            ElseIf type = 1 Then
                If lastlistetype = 0 Then
                    'RadioListeItems
                    rbliste.Items.Add(GetListItem(tmpNo, stdDefault, ItemQuantity_per, ItemDesc))
                ElseIf lastlistetype = 1 Then
                    'CheckBoxItem
                    cbliste.Items.Add(GetListItem(tmpNo, stdDefault, ItemQuantity_per, ItemDesc))
                ElseIf lastlistetype = 2 Then
                    '´Hidden Input
                    Form1.Controls.Add(GetHiddens(tmpNo, stdDefault, ItemQuantity_per))
                    Form1.Controls.Add(GetLabel(ItemDesc))
                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, ByVal stdDefault As Integer, ByVal ItemQuantity_per As Integer, ByVal description As String, Optional ByVal locked As Integer = 0) As ListItem
        Dim LocalListitem As New ListItem(name)
        LocalListitem.Selected = (1 = stdDefault)
        LocalListitem.Text = description
        LocalListitem.Value = name & "|#|" & ItemQuantity_per
        Return LocalListitem
    End Function

    Protected Function GetHiddens(ByVal name As String, ByVal stdDefault As Integer, ByVal ItemQuantity_per As Integer) As HtmlInputHidden
        Dim x As New HtmlInputHidden()
        x.ID = name
        x.Value = name & "|#|" & ItemQuantity_per
        Return x
    End Function

    Protected Function GetGroupLabel(ByVal name As String) As Label
        Dim x As New Label()
        x.Text = name
        x.Style.Add("font-weight", "bold")
        x.Style.Add("line-height", "50px")
        Return x
    End Function

    Protected Function GetLabel(ByVal name As String) As Label
        Dim x As New Label()
        x.Text = name
        Return x
    End Function


    Protected Function CreateDataSource() As DataTable
        Dim dt As DataTable = New DataTable("dummydata")
        dt.Columns.Add("type", GetType(Integer))
        dt.Columns.Add("Choicetype", GetType(Integer))
        dt.Columns.Add("no", GetType(String))
        dt.Columns.Add("defaultitem", GetType(Integer))
        dt.Columns.Add("Quantity_per", GetType(Integer))
        dt.Columns.Add("description", GetType(String))

        Dim newRow As DataRow = dt.NewRow()
        newRow("type") = 2
        newRow("Choicetype") = 0
        newRow("no") = "test1"
        newRow("defaultitem") = 0
        newRow("Quantity_per") = 1
        newRow("description") = "test1 Beskrivelse"
        dt.Rows.Add(newRow)

        newRow = dt.NewRow()
        newRow("type") = 1
        newRow("Choicetype") = 0
        newRow("no") = "test1"
        newRow("defaultitem") = 0
        newRow("Quantity_per") = 1
        newRow("description") = "test1 Beskrivelse2"
        dt.Rows.Add(newRow)

        newRow = dt.NewRow()
        newRow("type") = 1
        newRow("Choicetype") = 0
        newRow("no") = "test1"
        newRow("defaultitem") = 0
        newRow("Quantity_per") = 1
        newRow("description") = "test1 Beskrivelse3"
        dt.Rows.Add(newRow)

        newRow = dt.NewRow()
        newRow("type") = 2
        newRow("Choicetype") = 1
        newRow("no") = "test2"
        newRow("defaultitem") = 0
        newRow("Quantity_per") = 1
        newRow("description") = "test2 Beskrivelse"
        dt.Rows.Add(newRow)

        newRow = dt.NewRow()
        newRow("type") = 1
        newRow("Choicetype") = 1
        newRow("no") = "test2"
        newRow("defaultitem") = 0
        newRow("Quantity_per") = 1
        newRow("description") = "test2 Beskrivelse2"
        dt.Rows.Add(newRow)

        newRow = dt.NewRow()
        newRow("type") = 1
        newRow("Choicetype") = 1
        newRow("no") = "test2"
        newRow("defaultitem") = 0
        newRow("Quantity_per") = 1
        newRow("description") = "test2 Beskrivelse3"
        dt.Rows.Add(newRow)

        Return dt
    End Function

   
    Private Sub cbliste_SelectedIndexChanged1(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim C As Control
        Dim StrC As String
        Dim i As Integer
        Dim li As ListItem
        For Each C In Form1.Controls
            If TypeOf C Is CheckBoxList Then
                Dim cbl As CheckBoxList = CType(C, CheckBoxList)
                For Each li In cbl.Items
                    Dim selected As Boolean = li.Selected
                    If selected = True Then
                        StrC += li.Value & "<br>"
                    End If
                Next
            ElseIf TypeOf C Is RadioButtonList Then
                Dim rbl As RadioButtonList = CType(C, RadioButtonList)
                For Each li In rbl.Items
                    Dim selected As Boolean = li.Selected
                    If selected = True Then
                        StrC += li.Value & "<br>"
                    End If
                Next
            ElseIf TypeOf C Is HtmlInputHidden Then
                Dim hli As HtmlInputHidden = CType(C, HtmlInputHidden)
                StrC += hli.Value & "<br>"
            End If
        Next

        Label1.Text = StrC
    End Sub
Avatar billede sbi Nybegynder
09. oktober 2004 - 01:14 #7
Her er resten:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
    </HEAD>
    <body>
        <form id="Form1" name="Form1" method="post" runat="server">
        </form>
        <asp:Label id="Label1" runat="server">Label</asp:Label>
    </body>
</HTML>
Avatar billede snepnet Nybegynder
09. oktober 2004 - 01:56 #8
Det lyder lidt småklamt (måske en ny bug ;o)...

Protected Form1 As HtmlForm = New HtmlForm()
bør kun være
Protected Form1 As HtmlForm
(da du har formen angivet deklerativt i din aspx-kode, burde framworket sikre dig en initialisering).

Jeg synes også det ser ud som om du både smider listerne ind med :
Me.Controls(1).Controls.Add(rbliste)

og til sidste med :
Form1.Controls.Add(rbliste)

Jeg synes du skal prøve at holde dig til denne her :
Form1.Controls.Add(cbliste)

Hvis du bare tager den ene af listerne og skifter mellem AutoPostBack = True og False... Kan du så se præcis hvad der sker (så må du gerne skrive det her), og er det det samme hver gang ?

mvh
Avatar billede sbi Nybegynder
09. oktober 2004 - 17:49 #9
Fjernelsen af Me.Controls(1).Controls.Add(rbliste) var det der gjorde tricket!
Med fare for at gentage mig selv - TAK!

;O)

/SBI
Avatar billede snepnet Nybegynder
09. oktober 2004 - 18:21 #10
det var så lidt :o)
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester