Avatar billede montago Praktikant
10. august 2007 - 11:23 Der er 16 kommentarer og
1 løsning

Migreret VB.NET Webside fra VS2003 til VS2005 giver problemer

Jeg har migreret et ASP.NET/VB 1.1 projekt til .NET 2.0 sammen med at have lagt det ind i VS2005 i stedet for VS2003

de aller fleste ting virker som de skal, men ét problem jeg endnu ikke har kunnet regne ud hvorfor skulle have ændret sig, er en side som benytter sig af [Repeaters -- http://msdn.microsoft.com/msdnmag/issues/05/06/CuttingEdge/]

sagen er at i 2003 bliver ID felter "opgraderet" dvs. at de i koden står som simple navne inde i repeater sektionen - men at de i HTML'en over nettet er blevet mere komplekse, indeholdene GUID mm.

ex:
  <asp:ImageButton ID="imgBtnExpandCollapse" Runat="server" />
bliver til
  <input type="image" name="PageQuestion:repQuestionGroup:_ctl1:imgBtnExpandCollapse" id="PageQuestion_repQuestionGroup__ctl1_imgBtnExpandCollapse" onClick="ExpandCollapse(document.getElementById('PageQuestion_repQuestionGroup__ctl1_DataGridQuestions'),document.getElementById('PageQuestion_repQuestionGroup__ctl1_imgBtnExpandCollapse'));return false;" src="webmodules/images/plus.gif" border="0" />

i 2005 beholder disse ID felter deres simple id under runtime
ex:

<input type="image" name="imgBtnExpandCollapse" id="imgBtnExpandCollapse" src="webmodules/images/plus.gif" border="0" onclick="ExpandCollapse(document.getElementById('DataGridQuestions'),document.getElementById('imgBtnExpandCollapse'));return false;" language="javascript" />


jeg har kigget længe på koden, og det ser ikke ud til at det er koden som skaber disse specielle id-felter mm. men derimod .NET engine som gør noget ved HTML'en...


spørgsmålet er så om der er andre der har prøvet noget lign ?
Avatar billede neoman Novice
10. august 2007 - 11:56 #1
Har du ikke byttet om på beskrivelserne tilhørende VS2003/VS2005 ? Jeg har ikke mehget kendskab til 2003, men I VS2005, når man tilføjer noget JS , f.eks. i en repeaters OnDataBound eventet vha  myControl.Attributes.Add ('onclick', noget_javascript)
så står der, i "noget_javascript" ting som "...document.getElementByID('"+myControl.ClientID+"')...."

Det du ser i html'en er myWebcontrol.ClientID - som er det kompositte client-side ID sammensat af selve kontrollens ID, samt af id'er for alle de containere som kontrollen sidder i.

Hvilke problemer har du  ?
Avatar billede montago Praktikant
10. august 2007 - 13:03 #2
bingo !!

Dim attr As String
            attr = "ExpandCollapse(document.getElementById('" + Control.ClientID + "'),document.getElementById('" + imgBtn.ClientID + "'));return false;"


problemet er at VS2005 ikke skaber disse komplekse ID'er...
jeg læste list på codeproject om et lign problem: http://www.codeproject.com/aspnet/How_group_RButtons.asp?df=100&forumid=89802&exp=0&select=1999483

dét jeg ikke kan med den nye VS2005 output, er at vise/skjule nogle tables, som mangler deres unikke id'er
Avatar billede neoman Novice
10. august 2007 - 13:22 #3
"problemet er at VS2005 ikke skaber disse komplekse ID'er... " ??? Er det noget som du har set på klienten med egne øjne? For gør den normalt. Så der må være noget galt med koden et eller andet sted.

Vis  koden for det hele det event som tilføjer javascriptet samt det markup eller kode der er, som laver de tabeller som skal skjules/vises.

Og i øvrigt - alt det her er statisk ? dvs det er ikke noget med kontroller som bliver tilføjet dynamisk ?
Avatar billede montago Praktikant
10. august 2007 - 14:04 #4
ASPX koden -----------------------------------------------

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="ctlQuestion.ascx.vb" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" Inherits="SurveyFactory.ctlQuestion" %>
<%@ Register TagPrefix="cc1" Namespace="SurveyFactory" Assembly="SurveyFactory" %>
<!-- LIST -->
<TABLE cellPadding="2" width="100%">
    <TR>
        <TD>
            <table class="VisualGroup" >
            <tr>
                <td>
            <asp:Repeater id="repQuestionGroup" Runat="server">
                <HeaderTemplate>
                </HeaderTemplate>
                <ItemTemplate>
                    <table width="99%" class="border"  style="margin: 5px 5px 5px 5px;" >
                        <tr class="border">
                            <td width="70%">
                                <asp:ImageButton ID="imgBtnExpandCollapse" Runat="server" />
                                <asp:label id="lblGroupID" runat="server" visible="false" text="<%# Container.DataItem.GetQuestionGroup.GetID %>"/>
                                <asp:label id="lblGroupName" runat="server">...</asp:label>
                            </td>
                            <td width="10%">
                              <asp:Label ID="lblGrpOption" Runat="server"></asp:Label>
                            </td>
                            <td width="20%" align="right">
                                <asp:ImageButton ID="imgBtnNewQuestion" Runat="server" CausesValidation="false" AlternateText="New question" ImageUrl="images/icon_document.gif" />&nbsp;
                                <asp:ImageButton ID="imgBtnOrder" Runat="server" CausesValidation="false" AlternateText="Change order" ImageUrl="images/icon_updown.gif" />&nbsp;
                                <asp:ImageButton ID="imgBtnGroupEdit" Runat="server" CausesValidation="false" AlternateText="Edit group" ImageUrl="images/icon_edit.gif" />&nbsp;
                                <asp:ImageButton ID="imgBtnGroupRemove" Runat="server" CommandArgument="<%# Container.DataItem.GetQuestionGroup.GetID %>" onclick="btnDeleteQuestionGroup_Click" CausesValidation="false" AlternateText="Remove group" ImageUrl="images/icon_delete.gif" />&nbsp;
                            </td>
                        </tr>
                        <tr>
                            <td colspan="3">
                                <cc1:CustomDataGrid id="DataGridQuestions" EnableViewState="true" OnItemDataBound="DataGridQuestion_ItemDataBound" runat="server" Width="100%" AutoGenerateColumns="False" AllowSorting="True" AllowPaging="False" HeaderStyle-CssClass="tablerowHeader" AlternatingItemStyle-CssClass="tablerowAlternate" BorderWidth="0" BorderStyle="None" HeaderStyle-Height="20" SortColumn="0">
                                    <HeaderStyle CssClass="tablerowHeader"></HeaderStyle>
                                    <AlternatingItemStyle CssClass="tablerowAlternate"></AlternatingItemStyle>
                                    <ItemStyle CssClass="tableRowItem"></ItemStyle>
                                    <Columns>
                                        <asp:TemplateColumn SortExpression="0" HeaderText="Question" HeaderStyle-Width="70%" ItemStyle-Width="70%">
                                            <ItemTemplate>
                                                <asp:Label id="lblID" text="<%# Container.DataItem.GetID %>" Runat="server" Visible="False" />
                                                <asp:LinkButton runat="server" ID="LinkControl" Visible="False" commandname="open" />
                                                <%# CommonFunctions.ParseTags(GetFolderID,Container.DataItem.QuestionText) %>
                                            </ItemTemplate>
                                        </asp:TemplateColumn>
                                        <asp:TemplateColumn HeaderText="Properties">
                                            <ItemTemplate >
                                                <asp:label id="lblOptions" runat="server"></asp:label>
                                            </ItemTemplate>
                                        </asp:TemplateColumn>
                                        <asp:TemplateColumn HeaderText="Action&nbsp;" ItemStyle-HorizontalAlign="Right" HeaderStyle-HorizontalAlign="Right">
                                            <ItemTemplate>
                                        <asp:ImageButton ID="imgBtnRemove" Runat="server" CommandArgument="<%# Container.DataItem.GetID %>" onclick="btnDeleteQuestion_Click" CausesValidation="false" AlternateText="Remove question" ImageUrl="images/icon_delete.gif" />&nbsp;
                                    </ItemTemplate>
                                        </asp:TemplateColumn>
                                    </Columns>
                                </cc1:CustomDataGrid>
                            </td>
                        </tr>
                    </table>
                    <asp:PlaceHolder ID="phNewGroup" Runat="server" Visible="False">
                        </td></tr></table><table class="VisualGroupSpace"><tr><td></td></tr></table>
                    </asp:PlaceHolder>
                    <asp:table ID="tblPageBreak" Runat="server" CssClass="pagebreak">
                        <asp:TableRow>
                            <asp:TableCell HorizontalAlign="Center">pagebreak</asp:TableCell>
                        </asp:TableRow>
                    </asp:table>
                    <asp:PlaceHolder ID="phNewGroup2" Runat="server" Visible="False">
                        <table class="VisualGroup"><tr><td>
                    </asp:PlaceHolder>                   
                </ItemTemplate>
            </asp:Repeater>
            </td></tr></table>
        </TD>
    </TR>
</TABLE>

//--------------------------------------------------------------------------------

Events:

    Private Sub repQuestionGroup_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles repQuestionGroup.ItemDataBound
        If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
            Dim questionGrp As QuestionGroupAndQuestions = CType(e.Item.DataItem, QuestionGroupAndQuestions)
            ' ## Update labels ##
            Dim lblGroupID As Label = CType(e.Item.FindControl("lblGroupID"), Label)
            Dim lblGroupName As Label = CType(e.Item.FindControl("lblGroupName"), Label)
            Dim lblGrpOption As Label = CType(e.Item.FindControl("lblGrpOption"), Label)
            '
            Dim dg As CustomDataGrid = CType(e.Item.FindControl("DataGridQuestions"), CustomDataGrid)
            Dim imgBtnExpandCollapse As ImageButton = CType(e.Item.FindControl("imgBtnExpandCollapse"), ImageButton)
            Dim tblPageBreak As Table = CType(e.Item.FindControl("tblPageBreak"), Table)
            Dim phNewGroup As PlaceHolder = CType(e.Item.FindControl("phNewGroup"), PlaceHolder)
            Dim phNewGroup2 As PlaceHolder = CType(e.Item.FindControl("phNewGroup2"), PlaceHolder)
            '
            ExpandCollapse(oSurvey.GetID.ToString, dg, imgBtnExpandCollapse, lblGroupName)
            lblGroupID.Text = questionGrp.GetQuestionGroup.GetID.ToString
            lblGroupName.Text = "<B>Group:</B> " + questionGrp.GetQuestionGroup.Name()
            ' Options text
            lblGrpOption.Text = ""
            lblGrpOption.ToolTip = ""
            Dim condVec As ConditionVector = ConditionDataHandler.GetConditions(False, questionGrp.GetQuestionGroup.GetID)
            setOptionText(lblGrpOption, "C", "Conditions", condVec.Count > 0)
            setOptionText(lblGrpOption, "X", "Matrix group", (questionGrp.GetQuestionGroup.Type = 1))
            setOptionText(lblGrpOption, "R", "Place next group at right", (questionGrp.GetQuestionGroup.NextGroupPlacement = QuestionGroup.NextGroupPlacementEnum.RIGHT))
            setOptionText(lblGrpOption, "Q", "Fixed question width (" & questionGrp.GetQuestionGroup.QuestionWidth & " px)", (questionGrp.GetQuestionGroup.QuestionWidth > 0))
            '
            tblPageBreak.Visible = questionGrp.GetQuestionGroup.PageBreakAfter And Not (lastGroupID.Equals(questionGrp.GetQuestionGroup.GetID))
            phNewGroup.Visible = questionGrp.GetQuestionGroup.StartNewVisualGroup Or questionGrp.GetQuestionGroup.PageBreakAfter
            phNewGroup2.Visible = (questionGrp.GetQuestionGroup.StartNewVisualGroup Or questionGrp.GetQuestionGroup.PageBreakAfter) _
                                  And Not (lastGroupID.Equals(questionGrp.GetQuestionGroup.GetID))
            dg.DataSource = questionGrp.GetQuestions()
            dg.DataBind()
        End If
    End Sub

    Private Sub repQuestionGroup_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles repQuestionGroup.ItemCreated
        If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
            Dim questionGrp As QuestionGroupAndQuestions = CType(e.Item.DataItem, QuestionGroupAndQuestions)
            ' ## Buttons ##
            ' New question
            ' Dim objQuiz As Quiz = CurrentQuiz
            'If (Not objQuiz Is Nothing) And
            If (Not questionGrp Is Nothing) Then
                ' New
                Dim imgBtnNewQuestion As ImageButton = CType(e.Item.FindControl("imgBtnNewQuestion"), ImageButton)
                If (GetLanguageID() = GetAdminModule.GetDefaultLanguage(GetOwnerID)) Then
                    RegisterOpenDialog(imgBtnNewQuestion, Formatting.WIN_QUESTION_WIDTH, Formatting.WIN_QUESTION_HEIGHT, Question_Params(EditMode.NEW_QUESTION, GetFolderID, questionGrp.GetQuestionGroup.GetID, Nothing))
                Else
                    imgBtnNewQuestion.Visible = False
                End If
                ' Move
                Dim imgBtnOrder As ImageButton = CType(e.Item.FindControl("imgBtnOrder"), ImageButton)
                RegisterOpenDialog(imgBtnOrder, Formatting.WIN_MGR_WIDTH, Formatting.WIN_MGR_HEIGHT, "manageLists.aspx?Type=" & CType(MoveType.MoveQuestions, Integer) & "&GroupID=" + questionGrp.GetQuestionGroup.GetID.ToString)
                ' Edit group
                Dim imgBtnGroupEdit As ImageButton = CType(e.Item.FindControl("imgBtnGroupEdit"), ImageButton)
                RegisterOpenDialog(imgBtnGroupEdit, Formatting.WIN_QGRP_WIDTH, Formatting.WIN_QGRP_HEIGHT, QuestionGroup_Params(EditMode.EDIT_QUESTION, Nothing, questionGrp.GetQuestionGroup.GetID.ToString))

                ' Delete (confirm)
                Dim imgBtnRemove As ImageButton = CType(e.Item.FindControl("imgBtnGroupRemove"), ImageButton)
                RegisterScript_ConfirmFieldChange(imgBtnRemove, "Remove group?")
                '
                If (_role = User.USER_ROLE.READONLY_USER) Then
                    imgBtnNewQuestion.Visible = False
                    imgBtnRemove.Visible = False
                End If
            End If
        End If
    End Sub

    Private Sub setOptionText(ByRef lbl As Label, ByVal strOption As String, ByVal strHint As String, ByVal isSet As Boolean)
        If (isSet) Then
            If lbl.Text <> "" Then
                strHint = ", " + strHint
            End If
            lbl.Text += strOption
            lbl.ToolTip += strHint
        End If
    End Sub

    Protected Sub DataGridQuestion_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGridQuestions.ItemDataBound
        If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
            Dim quest As Question = CType(e.Item.DataItem, Question)
            Dim lblOptions As Label = CType(e.Item.FindControl("lblOptions"), Label)
            ' Show options
            lblOptions.Text = ""
            lblOptions.ToolTip = ""
            setOptionText(lblOptions, "M", "Mandatory", quest.IsMandatory)
            setOptionText(lblOptions, "T", "Text field", quest.AllowUserComments)
            'AHP Nedenstående udkommenteret da den ikke længere er exclusive
            'If (Not quest.IsMandatory) Then ' Exclusive...
            Dim condVec As ConditionVector = ConditionDataHandler.GetConditions(True, quest.GetID)
            setOptionText(lblOptions, "C", "Conditions", condVec.Count > 0)
            'End If
        '
        Dim lb As LinkButton = CType(e.Item.FindControl("LinkControl"), LinkButton)
        If lb.CommandName = "open" Then
            Dim attr As String = GetOpenDialogAttr(Formatting.WIN_QUESTION_WIDTH, Formatting.WIN_QUESTION_HEIGHT, Question_Params(EditMode.EDIT_QUESTION, GetSurveyID, quest.QuestionGroupID, quest.GetID), "if (result=='reload') { __doPostBack('','');} ")
            e.Item.Attributes.Add("onClick", attr)
        End If
        '
        Dim imgBtnRemove As ImageButton = CType(e.Item.FindControl("imgBtnRemove"), ImageButton)
        RegisterScript_ConfirmFieldChange(imgBtnRemove, "Remove question from this group?")
        End If
    End Sub
Avatar billede montago Praktikant
10. august 2007 - 14:07 #5
Script parser:

    Public Sub ExpandCollapse(ByVal strID As String, _
                              ByVal control As WebControls.WebControl, _
                              ByVal imgBtn As WebControls.ImageButton, _
                              Optional ByVal lbl As WebControls.Label = Nothing)
        Dim strScript As New System.Text.StringBuilder
        Dim PostBackEventRef As String
        If Not (imgBtn Is Nothing) Then
            Dim ctrlName As String = imgBtn.ID.ToString
            PostBackEventRef = Me.Page.GetPostBackEventReference(imgBtn, "")
            PostBackEventRef = PostBackEventRef.Replace("'", "\'")

            Dim attr As String
            attr = "ExpandCollapse(document.getElementById('" + Control.ClientID + "'),document.getElementById('" + imgBtn.ClientID + "'));return false;"
            imgBtn.Attributes.Clear()
            imgBtn.Attributes.Add("onClick", attr)
            If (Not lbl Is Nothing) Then
                lbl.Attributes.Add("onClick", attr)
                lbl.Style.Add("Cursor", "Hand")
            End If
            imgBtn.ImageUrl = "images/plus.gif"

            If (Not Page.IsClientScriptBlockRegistered("RegisterExpandCollapsePanel")) Then
                Dim jScript As StringBuilder = IOHelper.RetrieveEmbeddedResource("ExpandCollapseGrid.js")
                IOHelper.Arg(jScript, "$PAGE_ID$", strID)
                IOHelper.Arg(jScript, "$CTRL_ID1$", Control.ClientID.Substring(0, Control.ClientID.IndexOf("__ctl") + 5))
                IOHelper.Arg(jScript, "$CTRL_ID2$", "_" + Control.ID)
                IOHelper.Arg(jScript, "$MINUS_IMG$", "webmodules/images/minus.gif")
                IOHelper.Arg(jScript, "$PLUS_IMG$", "webmodules/images/plus.gif")
                Page.RegisterClientScriptBlock("RegisterExpandCollapsePanel", jScript.ToString())
            End If
            RegisterCookies()
        End If
    End Sub
Avatar billede neoman Novice
10. august 2007 - 14:30 #6
Den kode du viser er hvad? .NET 1.1 eller .NET 2 ? Kører det i VS2005 ? For der er datagrid-ting som System.Web.UI.WebControls.DataGridItemEventArgs som formentligt ikke kører under .NET 2 normalt.
Avatar billede neoman Novice
10. august 2007 - 14:38 #7
Hmm det gør de så alligevel.. never mind.

Så det specifikke problem er hvad ? At den dg som skal kollapses/åbnes ikke har et  sammensat ID på klienten, (og så ikke kan findes af den ellers korrekte js-fuinktion) ??
Avatar billede neoman Novice
10. august 2007 - 15:13 #8
Du ku også prøve at steppe igennem med debuggeren omkring           
attr = "ExpandCollapse(document.getElementById('" + Control.ClientID + "'),document.getElementById('" + imgBtn.ClientID + "'));return false;" og se hvilke ClientID bliver sendt afsted
Avatar billede montago Praktikant
10. august 2007 - 15:26 #9
jep... .NET 1.1 kode som blev migreret til VS2005 .NET 2.0

"Så det specifikke problem er hvad ? At den dg som skal kollapses/åbnes ikke har et  sammensat ID på klienten, (og så ikke kan findes af den ellers korrekte js-fuinktion) ??" <- jeps !

har prøvet at steppe igennem, og id's er ikke sammensat som man så i .NET 1.1
Avatar billede montago Praktikant
13. august 2007 - 10:02 #10
er kommet frem til at det er ClientID som ikke returnere et unikt ID... på samme måde som .NET 1.1 gjorde...

ClientID er en property på Control som også er typen på det object som bliver parsed til ExpandCollapse() -- Selve objectet er dog en CustomControl som arver fra datagrid, ingen overrides
Avatar billede neoman Novice
13. august 2007 - 10:29 #11
Det her er ikke umiddelbart noget jeg kender ret meget til:-(

Jeg har en gang haft nogle problemer med ClientID. Den gang skyldtes problemerne at ClientID blev forespurgt "for tidligt" - dvs, den kontrol for hvilken ClientID blev forsøgt hentet, endnu ikke var tilføjet til kontroltræet på det tidspunkt.
Avatar billede neoman Novice
13. august 2007 - 11:36 #12
Og her en som havde et lignende problem : http://www.velocityreviews.com/forums/t89264-clientid-in-repeater-gives-the-control-id.html

hvordan det så stemmer overens med at din kode virkede i 1.1, men ikke funker i .net 2, er så et helt andet mysterium:)
Avatar billede neoman Novice
13. august 2007 - 12:05 #13
Og ved nærmere eftertanke: jeg har lige haft nogle problemer med en repeater, som opførte sig mærkeligt. Jeg forsøgte at databinde den fra PageLoad, men der var nogle data den ikke fik fat i. Til gengæld virkede det fint at databinde den i PreRender. Enderesultatet blev, at jeg smed repeateren ud og brugte et gridview til at vise de samme data og den kunne jeg fint databinde i PageLoad - til de selvsamme data som før!

Jeg ved ikke om det var en .NET 2.0 "feature" eller en Error 40, men nu virker min kode i hvertfald. Hvis du kan, kunne du prøve et eksperiment og prøve at binde den i PreRender, og se om dine clientID'er så får de forventede værdier.
Avatar billede montago Praktikant
14. august 2007 - 08:49 #14
Det vil jeg lige prøve... læste faktisk også lidt om et lignende eksempel, hvor pre_render gav et bedre resultat...
Avatar billede montago Praktikant
20. august 2007 - 14:51 #15
test
Avatar billede montago Praktikant
20. august 2007 - 14:53 #16
GRRR Eksperten flunkede... prøver at sende igen :


Har læst og læst om Repeaters og fatter ikke hvad der går galt :( har prøvet at putte Databind ned i Page_Prerender uden success

Kan det være et problem at objektet som der itereres igennem, bliver cast'ed til WebControl !?

-----------

'<ToolboxData("<{0}:CustomDataGrid runat=server AllowSorting=True AllowPaging=False CustomPaging=False></{0}:CustomDataGrid>"), _
'Serializable()> _
Public Class CustomDataGrid
    Inherits System.Web.UI.WebControls.Datagrid
...
...
End Class
Avatar billede montago Praktikant
03. oktober 2007 - 14:34 #17
Vi løste problemet ved at installere SP1 til VS2005 samt en Patch... derefter kunne VS2005 æde et VS2003 projekt
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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