Avatar billede jaffafo Nybegynder
15. november 2007 - 13:49 Der er 14 kommentarer og
1 løsning

Problem med usercontrols og placeholders

Hej

Jeg har følgende opbygning:

ASPX indeholder:
---------------------
Placeholderen PH
---------------------

PH får så smidt en userControl UC ind som igen indeholder en ny placeholder:

UC:
---------------------
Placeholderen PH2
---------------------

Nu vil jeg så gerne smide andre usercontrols ind i PH2, hvilket jeg godt kan. Men nu har jeg så smidt en knap ind på usercontrollen i PH2 hvor jeg har en OnClick event. Problemet er at når jeg trykker på den knap "tømmes" BEGGE placeholdere og den kode inde i OnClick eventen bliver slet ikke kørt..  Jeg har forsøgt med Response.Write("test"); osv..

Hvis det ikke er til at forstå kan jeg godt smide lidt kode ind..
Avatar billede jaffafo Nybegynder
15. november 2007 - 13:53 #1
her er koden:

PAGE:
protected void Page_Load(object sender, EventArgs e)
{
    phAdmin.Controls.Add((UserControl)LoadControl("user.ascx"));
}

user.ascx:
protected void adduser_click(object sender, EventArgs e)
{
    Response.Write("hej");
}
<asp:Button ID="btnAdduser" Text="New user" OnClick="adduser_click" runat="server" />



Den Response.Write bliver aldrig kørt..  hvorfor? :(
Avatar billede neoman Novice
15. november 2007 - 14:09 #2
Avatar billede jaffafo Nybegynder
18. november 2007 - 18:44 #3
fin artikel, men jeg får det stadig ikke til at virke..

Jeg gemmer mine usercontrols i en Session[] som jeg sætter ved en OnClick event.. Men der skal 2 postback til at få det vist på siden:

Min page_load indeholder dette:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["uc"] != null)
                phAdmin.Controls.Add(LoadControl(Session["uc"].ToString() + ".ascx"));
        }

men min OnClick event ser sådan ud:

        protected void loaduser(object sender, EventArgs e)
        {
            Session["uc"] = ((Button)sender).CommandName;
        }

Hvor er fejlen?
Avatar billede neoman Novice
18. november 2007 - 19:04 #4
Så må du komme med en præcis beskrivelse af hvad du gør. "Smide" er et tvetydigt fyldord.

Bliver dine kontroller loadet permanent i markup eller som svar på events ? I sidste fald vis  hele den relevante kode: Hvilke events bliver kaldt hvorfra og hvornår, og hvordan bliver kontrollerne loaded første gang og derpå ved postback.

"Jeg gemmer mine usercontrols i en Session[] som jeg sætter ved en OnClick even" og så viser du: Session["uc"] = ((Button)sender).CommandName - dette er en string som bliver gemt i en session, ikke en user kontrol. Så hvad mener du egentligt ?

Den mekanik du viser vil ikke vise noget som helst ved første klik men kun efter efterfølgende postback. Det står faktisk altsammen i den artikel jeg linkede til: Når du klikker på noget laver en side postback, så kører page_load, derpå alle click-handlers, og eftersom din "void loaduser" ikke loader noget selv men kun sætter en string ind i session, så vil der ikke sker mere før næste postback, hvor der er en kontrol som loades i page load.
Avatar billede jaffafo Nybegynder
18. november 2007 - 19:13 #5
admin.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="admin.aspx.cs" Inherits="WebsiteIncrement.admin.admin" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Admin</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btnLoadUser" OnClick="loaduser" CommandName="useraccount" Text="Users" runat="server" />
        <asp:Button ID="btnLoadLog" OnClick="loaduser" CommandName="log" Text="Log" runat="server" />
        <asp:Button ID="btnLoadCodebook" OnClick="loaduser" CommandName="codebook" Text="Codebook" runat="server" />
        <asp:PlaceHolder ID="phAdmin" runat="server" />
    </div>
    </form>
</body>
</html>


admin.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace WebsiteIncrement.admin
{
    public partial class admin : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["uc"] != null)
                phAdmin.Controls.Add((UserControl)Session["uc"]);
        }

        protected void loaduser(object sender, EventArgs e)
        {
            UserControl uc = (UserControl)LoadControl(((Button)sender).CommandName + ".ascx");
            Session["uc"] = uc;
        }
    }
}
Avatar billede neoman Novice
18. november 2007 - 19:21 #6
Dette tror jeg ikke gør det bedre end det forrige skud: du viser ikke din kontrol før næste postback. Desuden: er der nogen særlig årsag til at gemme hele kontrollen i session ?

Prøv dette:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["uc"] != null)
                phAdmin.Controls.Add(LoadControl(Session["uc"].ToString() + ".ascx"));
        }

og

        protected void loaduser(object sender, EventArgs e)
        {
            Session["uc"] = ((Button)sender).CommandName;
            phAdmin.Controls.Add(LoadControl(Session["uc"].ToString() + ".ascx"));
        }

og hvis du ønsker at gemme hele kontrollen i stedet for blot filnavnet så kan du passende ændre i begge handlers.
Avatar billede jaffafo Nybegynder
18. november 2007 - 19:25 #7
whoops  glemte at opdatere min page_load..

Men ideen med dette er at jeg vil gemme i en session hvilken usercontrol den skal hente ved næste postback. Og hvis det ikke er det jeg har lavet kan du så ikke lige hurtigt give et lille forslag til hvordan jeg så skal gøre?  Det er vel egentlig ligemeget om jeg gemmer navnet på controllen eller controllen selv i session.. jeg skal bare have den hentet frem ved næste postback
Avatar billede neoman Novice
18. november 2007 - 19:44 #8
Du har lige fået "et lille forslag"  18/11-2007 19:21:54 - gør den ikke det du ønsker?
Avatar billede jaffafo Nybegynder
18. november 2007 - 19:50 #9
nej..  den kræver stadig 2 postbacks..
Avatar billede neoman Novice
18. november 2007 - 19:58 #10
Når du klikker på en af de her knapper:
      <asp:Button ID="btnLoadUser" OnClick="loaduser" CommandName="useraccount" Text="Users" runat="server" />
        <asp:Button ID="btnLoadLog" OnClick="loaduser" CommandName="log" Text="Log" runat="server" />
        <asp:Button ID="btnLoadCodebook" OnClick="loaduser" CommandName="codebook" Text="Codebook"
så får du ikke nogen ny kontrol at se på skærmen før næste postback med den kode jeg gav dig 18/11-2007 19:21:54 ? Det har jeg svært ved at tro, medmindre du loader en meget kryptisk kontrol. Hvad ligger der i ascx filen ?
Avatar billede jaffafo Nybegynder
18. november 2007 - 20:06 #11
Nu har jeg følgende kode:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace WebsiteIncrement.admin
{
    public partial class admin : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["uc"] != null)
                phAdmin.Controls.Add(LoadControl(Session["uc"].ToString() + ".ascx"));
        }

        protected void loaduser(object sender, EventArgs e)
        {
            Session["uc"] = ((Button)sender).CommandName;
            phAdmin.Controls.Add(LoadControl(Session["uc"].ToString() + ".ascx"));
        }
    }
}

Men det smider den usercontrol ind 1 gang efter det første postback (hvilket er det jeg vil), men så 2. gang smider den usercontrollen ind 2 gange.. :(
Avatar billede neoman Novice
18. november 2007 - 20:25 #12
hvis du klikker på den samme knap og kontrollen allerede ER loadet inde i PageLoad,  så tilføjer du den samme kontrol en gang til - jeg kan ikke gætte hvad logik der skal køres, så det må du lige selv ordne:)

Når du klikker på en knap så postes siden tilbage, derpå kører PageLoad og derpå kører din "loaduser" og derpå sendes hele molevitten til browseren. Det er den rækkefølge tingene sker i så bid mærke i det.
Avatar billede jaffafo Nybegynder
18. november 2007 - 22:18 #13
jeg har givet op :)

Nu loader jeg bare alle usercontrols ind og sætter dem til visible = false; og så ændrer deres visible status alt efter hvilken knap jeg trykker på..

Men det må da kunne laves smartere?
Avatar billede neoman Novice
19. november 2007 - 16:54 #14
Yes, no, maybe. Uden en beskrivelse af krav til systemet, og af den tiltænkte implementering, så kan du kun forvente et bedre svar fra folk som ejer en bedre krystalkugle end jeg.
Avatar billede jaffafo Nybegynder
01. december 2008 - 13:52 #15
lukker..
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



IT-JOB

Sentia Denmark A/S

Service Delivery Manager

Udviklings- og Forenklingsstyrelsen

Controller til økonomi og compliance

Udviklings- og Forenklingsstyrelsen

Backend-udvikler til ny platform i Azure

Politiets Efterretningstjeneste

Centerchef til Center for Support og Proces i PET