Toon posts:

[C#] Placeholder Dynamic Control Click Event not working

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het volgende:

Ik heb een pagina waar een placeholder in staat, hierin laad ik door middel van xml/xslt deze webcontrol met een dropdownlist web control .

Nu ziet de aanroep van de dropdownlist control als volgt eruit in XSL:

code:
1
2
3
4
5
6
7
8
<asp:DropDownList id="ddlPageType" runat="server" onSelectedIndexChanged="addPageComponent" AutoPostBack="True">
    <xsl:for-each select="values/value">
          <xsl:variable name="sub_field_name" select="@name"/>
          <xsl:variable name="sub_field_value" select="."/>
          <xsl:variable name="sub_field_translated_name" select="$translations/element[@original = $sub_field_name] "/>
          <asp:ListItem Value="{$sub_field_value}"><xsl:value-of select="$sub_field_translated_name" /></asp:ListItem>
     </xsl:for-each>
</asp:DropDownList>


Deze word getransformeerd en het resultaat word getoont in de
placeholder.

Dit werkt allemaal uitstekend en krijg netjes de dropdownlist te zien.

Nu indien ik een selectie maakt word niet het event gestart die ik zojuist hebt aangegeven namelijk "addPageComponent" in de "onSelectIndexChanged".

Indien ik gewoon niet dynamisch de web controls via xml/xsl doet en zet het rechtstreek in de code, werkt het wel en start ie de event op.

Ik heb even een test gemaakt om het voor jullie wat te verduidelijken en hieronder geplaatst zodat jullie het probleem kunnen simuleren

[index.aspx]
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<%@ Page Language="C#" Debug="true" %>
<%@ import Namespace="System.Web.UI" %>
<%@ import Namespace="System.Web.UI.WebControls" %>
<%@ import Namespace="System.Web.UI.HtmlControls" %>
<%@ import Namespace="System.Xml" %>
<%@ import Namespace="System.Xml.Xsl" %>
<%@ import Namespace="System.IO" %>
<script runat="server">
    public void addPageComponent(Object sender, EventArgs e)
    {
           Response.Write("Clicked");
    }
    
    public void transFormXML(string xmlFile, string xslFile)
    {
    
            XmlDocument xml = new XmlDocument();
            XslTransform xslt = new XslTransform();
    
            xml.Load(Server.MapPath(xmlFile));
            xslt.Load(Server.MapPath(xslFile));
    
            StringWriter sw = new StringWriter();
            xslt.Transform(xml, null, sw);
    
            string result = sw.ToString();
    
            result = result.Replace("xmlns:asp=\"removeme\"", "");
    
            Control ctrl = Page.ParseControl(result);
            
            phComponents.Controls.Add(ctrl);
    }
    
    public void Page_Init(Object sender, EventArgs e) {
        transFormXML("components.xml", "components.xsl");
    }
    
</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
    <title>Test</title> 
    <meta content="Microsoft Visual Studio 7.0" name="GENERATOR" />
    <meta content="C#" name="CODE_LANGUAGE" />
    <meta content="JavaScript" name="vs_defaultClientScript" />
    <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema" />
</head>

<body leftmargin="5" topmargin="5" marginwidth="5" marginheight="5">

     <form id="pageForm" runat="server">

           Selecteer: (deze werkt en fired de onclick)<br>
           Dropdownlist #1:
           <asp:DropDownList id="ddComponentsType" runat="server" OnSelectedIndexChanged="addPageComponent" AutoPostBack="True">
                       <asp:ListItem Value="image">image</asp:ListItem>
                       <asp:ListItem Value="text">text</asp:ListItem>
           </asp:DropDownList>
           
           <p />=====================<p />
           
           Selecteer: (Deze werkt niet en fired niet de onclick)<br>
           
           <asp:placeholder id="phComponents" runat="server"></asp:placeholder>
     </form>
</body>
</html>


==================================

[components.xml]
code:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>
<component name="component_properties">
    <property type="select" name="component_name">
        <name>component</name>
        <values>
            <value name="component_image">image</value>
            <value name="component_text">text</value>
        </values>
    </property>
</component>


==================================

[components.xsl]
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:asp="removeme">
       
        <xsl:template match="/component/property">
            <xsl:choose>
                <xsl:when test="@type='select'">
                    <tr>
                        <td align="right" valign="middle" width="175">Dropdownlist #2:<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></td>
                        <td align="left" valign="middle" width="400">
                            <asp:DropDownList id="ddlPageType" runat="server" OnSelectedIndexChanged="addPageComponent" AutoPostBack="True" EnableViewState="True">
                                    <xsl:for-each select="values/value">
                                        <asp:ListItem Value="{@name}"><xsl:value-of select="."/></asp:ListItem>
                                    </xsl:for-each>
                            </asp:DropDownList>
                        </td>
                        <td width="100"><xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></td>
                    </tr>
                </xsl:when>
            </xsl:choose>
        </xsl:template>

</xsl:stylesheet>


De volgende bestanden kunnen ook gedownload worden om direct te testen:

index.aspx
components.xml
components.xsl

Bedankt alvast voor de genome moeite om dit probleem op te lossen.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
mja, wat je doet is at runtime <asp:... > tags inserten, maar die worden imho niet gecompileerd met de code behind. ASP.NET als geheel zal dan dus niet de javascript code adden die nodig is voor clientside eventhandling (die jij wilt).

Je moet de controls dus in C# code adden aan de placeholder en via de initializers initialiseren, alleen dan krijg je de controls die jij wilt. Jij prakt nu html in je output, terwijl dat nog geprocessed moet worden :)

Wat jij wilt kan volgens mij niet.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Wat ik dan niet begrijp is dat je wel die web controls kan uitlezen met FindControl maar dat het event van die control niet kan worden geprocessed.

Dit moet dan toch ook niet mogelijk zijn??

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 15 April 2003 @ 13:19:
Wat ik dan niet begrijp is dat je wel die web controls kan uitlezen met FindControl maar dat het event van die control niet kan worden geprocessed.
Dit moet dan toch ook niet mogelijk zijn??
Nou, je zit op verkeerde plekken in de pipeline dingen toe te voegen. ASP.NET lijkt wel erg complex maar in feite doet het niets anders dan HTML writen naar de browser. Wat jij nou aan het doen bent is op het allerlaatst asp.net code writen terwijl dat data/code is dat nog geprocessed moet worden. (je kunt ook bv niet at runtime je code behind page wijzigen).

ASP.NET laadt het page object, vuurt wat events af en de handlers in het page object handlen die events. Je moet dan fysiek de objects toevoegen aan de page' object collection, niet aan de page tekst toevoegen, want dat heeft geen zin, zo werkt ASP.NET niet. (zo deed asp het wel, maar dat is interpreted, dit is compiled). ASP.NET compileert de page zelf ook naar een object.

Je moet dus je control scheiden van de contents van het control. Je control bouw je in een usercontrol, daarvan maak je een instance, die voeg je toe aan de page at runtime, en aan die INSTANCE geef je dan de data door die in het control moet komen, bv je bind een list met data aan de combobox. at runtime wordt dan die lijst gebind wat inhoudt dat ASP.NET html genereert, of beter, de combobox control write de html voor de <option> tags.

Dus compiled code loopt door data en write de data naar de output. Jij bent dit proces volledig verkeerd aan het benaderen, jij wilt nl de output writen mbv een xsl conversie.

Dat KAN best, maar je moet dan harde HTML in je xsl template plaatsen, zodat ASP.NET de XSL conversieoutput direct write naar de client. Echter, ASP.NET kent dan het control niet natuurlijk, want het is niet fysiek aanwezig in je page.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com