Avatar billede fuldstop Nybegynder
06. maj 2015 - 11:12 Der er 4 kommentarer og
1 løsning

Control i placeholder og AsyncPostBackTrigger

Jeg genererer dynamisk en graf (image map) vha. MS Charts (datavisualization) fra codebehind og overfører dette billede/control til aspx siden vha. en placeholder.

Dette fungerer også fint, problemet er at jeg på serierne på grafen har nogle postback værdier, som skal generer en ny graf i en anden placeholder (asynkront). Når jeg henter siden får jeg ingen fejl fra debuggeren, men når jeg trykker på grafen sker der intet (og jeg kan se i debuggeren fra browseren f12, at den ikke kan finde det controlid som jeg bruger til den asynkrone postback) Sys.WebForms.PageRequestManagerServerErrorException: A control with ID 'Chart0' could not be found for the trigger in UpdatePanel 'UpdatePanel1'.

Er det fordi jeg ikke få fat i controlid'et når det ligger i en placeholder udenfor updatepanellet, eller ???

Aspx:

<div style="float: left; width: 483px; height: 420px; border: solid 1px #CCCCCC;">
        <span class="sub_header2">S p æ d e v a n d s</span><span class="sub_header1"> F o r b r u g</span><span class="sub_header3"> ( F T S V A N D )</span>
        <asp:PlaceHolder runat="server" id="phimg0"/>
    </div>

    <div style="float: left; width: 2px; height: 100px; margin: 0 auto;">
    </div>
       
    <div style="float: left; width: 483px; height: 420px; border: solid 1px #CCCCCC;">
        <span class="sub_header2">S p æ d e v a n d s</span><span class="sub_header1"> H i s t o r i k</span><span class="sub_header3"></span>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server" ChildrenAsTriggers=true >
            <ContentTemplate>
                <asp:Label id="Postback_Text" runat="server" />
            </ContentTemplate>
        <Triggers>
                                          <asp:AsyncPostBackTrigger ControlID="Chart0" />
                               
                            </Triggers>
        </asp:UpdatePanel>   
        <div style="margin-top: 8px;"><asp:PlaceHolder runat="server" id="phimg1"/></div>
    </div>


Codebehind:

Dim myControl As Control = FindControl("phimg" & i)
    Dim myChart As New Chart
    mychart.ID = "Chart" & i
    myControl.Controls.Add(myChart)
    myChart.Height = Unit.Pixel(MyChartSpecifics(i,4))
    myChart.Width = Unit.Pixel(MyChartSpecifics(i,1))
    myChart.RenderType = RenderType.ImageTag
    myChart.ImageStorageMode = ImageStorageMode.UseImageLocation
    myChart.ImageLocation = "~/Images/Chart" & i
    'AddHandler myChart.Click, AddressOf myChart_Click
    'myChart.CssClass = "chart"

..og lidt længere nede

myChart.Series(1).PostBackValue = "#VALX"
Avatar billede keysersoze Guru
06. maj 2015 - 13:16 #1
Husker du at gentegne kontroller ved postback? Hvis ikke så findes de ikke.
Avatar billede fuldstop Nybegynder
06. maj 2015 - 14:21 #2
Hej Keysersoze

Det er vist der den hænger :)

har tilføjet ScriptManager1.RegisterAsyncPostBackControl(myChart) til page_load og fjernet AsyncPostBackTrigger fra .aspx, samt tilføjet UpdatePanel1.Update() til sub-rutinen. og nu virker det. Dog med det forbehold, at det tager 2,5 sek. at hente den tekst til updatepanelet når der køres asynkront. Gør ud fra at det er fordi at hele mychart controlen skal køres igen ved den asynkrone postback??

Page Load:
Dim myControl As Control = FindControl("phimg" & i)
    Dim myChart As New Chart
    mychart.ID = "Chart" & i
    AddHandler myChart.Click, AddressOf myChart_Click
    myControl.Controls.Add(myChart)
    myChart.Height = Unit.Pixel(MyChartSpecifics(i,4))
    myChart.Width = Unit.Pixel(MyChartSpecifics(i,1))
    myChart.RenderType = RenderType.ImageTag
    myChart.ImageStorageMode = ImageStorageMode.UseImageLocation
    myChart.ImageLocation = "~/Images/Chart" & i
    ScriptManager1.RegisterAsyncPostBackControl(myChart)

Sub-rutinen myChart_Click:
Protected Sub myChart_Click(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ImageMapEventArgs)
       
        Postback_Text.Text = (e.postbackvalue) & (sender.ID)
        UpdatePanel1.Update()
       
    End Sub

Aspx:

        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>

        <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server" >
            <ContentTemplate>
                <asp:Label id="Postback_Text" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
Avatar billede fuldstop Nybegynder
07. maj 2015 - 07:46 #3
Smider du et svar, keysersoze?
Avatar billede keysersoze Guru
07. maj 2015 - 09:27 #4
Hvis du kigger i din developer-toolbar kan du se hvad der reelt bliver dannet - men ja, alle events osv køres som var det et almindeligt postback, det eneste du eventuelt kan gøre er at undlade at tegne irrelevante kontroller og køre unødvendige events ved at pakke det ind i et if not asyncpostback. Hvis du debugger bør du også kunne se hvad der tager tid.

Det er blandt andet derfor webforms efterhånden er noget gammeldags at bruge (:
Avatar billede keysersoze Guru
07. maj 2015 - 18:23 #5
hov - svar.
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

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