Avatar billede brian-johansen Nybegynder
04. december 2006 - 20:30 Der er 16 kommentarer og
1 løsning

Dynamisk tilføjet usercontrols forsvinder !

Hej,
Jeg er støt ind i lidt af et problem, jeg har lavet sådan at brugeren selv kan tilføje usercontrols via en min wysiwyg editor, men problemet er bare at hvis man laver et postback på mine usercontrols (fx. trykker på en knap) så forsvinder de, og jeg ikke helt hvordan jeg skal løse det, da jeg ikke helt kan se hvordan jeg kan løse det ved querystrings, problemet er jo af det vidt forskelligt data den skal bruge.

Jeg tilføjer min usercontrols på følgende måde:
    public void replaceUsercontrols(string content)
    {
        string sCommandList;
        string[] sCommandArray;
        string sControlName;

        sCommandList = content;
        sCommandList = sCommandList.Replace("[", "#[");
        sCommandList = sCommandList.Replace("]", "]#");
        char[] splitter = { '#' };
        sCommandArray = sCommandList.Split(splitter);
        for (int i = 0; i <= sCommandArray.Length - 1; i++)
        {
            if (sCommandArray[i].IndexOf("[") != -1)
            {
                sControlName = sCommandArray[i];
                sControlName = sControlName.Replace("[", "");
                sControlName = sControlName.Replace("]", "");
                if (sControlName == "nyheder")
                {
                    this.Controls.Add(new UserControl().LoadControl(sControlName + ".ascx"));
                }
                else if (sControlName == "nbrev")
                {
                    this.Controls.Add(new UserControl().LoadControl("uc/"+sControlName + ".ascx"));
                }
            }
            else
            {
                this.Controls.Add(new LiteralControl(sCommandArray[i]));
            }
        }
       
    }


Er der nogen der har en løsning eller et hint til mig ?

mvh Brian
Avatar billede dr_chaos Nybegynder
04. december 2006 - 20:45 #1
du skal generer alle tilføjede kontroller igen ved hvert postback.
Du gør det ved at override Pre_Init() og så generer kontrollerne der.

Evt kan du gemme din content variable i et hidden field eller session og så hente den ved postback og så bare kalde din metode replaceUsercontrols.
Avatar billede brian-johansen Nybegynder
04. december 2006 - 20:47 #2
ok.... er det sådan du evt. lige har et kode eksempel på lager ? bare lige det med at override Pre_Init() , da jeg ikke lige er helt sikker på hvordan du mener jeg skal gøre det.

mvh Brian
Avatar billede dr_chaos Nybegynder
04. december 2006 - 21:21 #3
Indsæt over page_load i codebehind:
protected override void OnPreInit(EventArgs e)
    {
replaceUsercontrols(Session["content"]);
        base.OnPreInit(e);

    }
Avatar billede dr_chaos Nybegynder
04. december 2006 - 21:22 #4
ændre din metode til:
public void replaceUsercontrols(string content)
    {
Session["content"]=content;
        string sCommandList;
        string[] sCommandArray;
        string sControlName;

        sCommandList = content;
        sCommandList = sCommandList.Replace("[", "#[");
        sCommandList = sCommandList.Replace("]", "]#");
        char[] splitter = { '#' };
        sCommandArray = sCommandList.Split(splitter);
        for (int i = 0; i <= sCommandArray.Length - 1; i++)
        {
            if (sCommandArray[i].IndexOf("[") != -1)
            {
                sControlName = sCommandArray[i];
                sControlName = sControlName.Replace("[", "");
                sControlName = sControlName.Replace("]", "");
                if (sControlName == "nyheder")
                {
                    this.Controls.Add(new UserControl().LoadControl(sControlName + ".ascx"));
                }
                else if (sControlName == "nbrev")
                {
                    this.Controls.Add(new UserControl().LoadControl("uc/"+sControlName + ".ascx"));
                }
            }
            else
            {
                this.Controls.Add(new LiteralControl(sCommandArray[i]));
            }
        }
     
    }
Avatar billede brian-johansen Nybegynder
04. december 2006 - 21:58 #5
Kanon, er det sådan at jeg kan bruge dette på en usercontrol ?
Avatar billede brian-johansen Nybegynder
04. december 2006 - 22:03 #6
Jeg får godt nok en fejl der hedder:
no suitable method found to override , det skal lige siges at det er på en usercontrol jeg bruger det.... er det muligt ?

mvh Brian
Avatar billede dr_chaos Nybegynder
05. december 2006 - 09:10 #7
prøv med
protected override void OnPreRender(EventArgs e)
    {
replaceUsercontrols(Session["content"]);
        base.OnPreRender(e);
    }
Avatar billede brian-johansen Nybegynder
06. december 2006 - 08:55 #8
Det virker næsten! jeg har bare stadig det problem, at trykker på fx. en knap så udføre den ikke den metode der følger med knappen.... men den viser fint nok usercontrollen bagefter ?

mvh Brian
Avatar billede dr_chaos Nybegynder
06. december 2006 - 08:57 #9
du mangler højst sandsynlig at tilføje events til knapper. hvordan ser hele din codebehind fil ud ?
Avatar billede brian-johansen Nybegynder
06. december 2006 - 09:01 #10
Usercontrolens ser sådan ud: (nbrev.ascx)
protected void Page_Load(object sender, EventArgs e)
    {

       
    }
    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        SqlConnection myConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ASPNETDBConnectionString"].ToString());
        SqlCommand myCmd = new SqlCommand();
        myCmd.Connection = myConn;
        myCmd.CommandText = "Insert Into mail(navn,email) Values (@overskrift,@indhold)";

        myCmd.Parameters.Add("@overskrift", SqlDbType.VarChar).Value = TextBox1.Text;
        myCmd.Parameters.Add("@indhold", SqlDbType.Text).Value = TextBox2.Text;
        try
        {
            myConn.Open();
            myCmd.ExecuteNonQuery();

        }
        catch { Response.Write("Der opstod en fejl, Kontakt support"); }
        finally
        {
            myConn.Close();


        }
        TextBox1.Text = "";
        TextBox2.Text = "";
    }

og hele min indlæsnings usercontrol ser sådan ud: (content.ascx)
public partial class UC_context : System.Web.UI.UserControl
{
    string navn;

    protected override void OnPreRender(EventArgs e)
    {
        replaceUsercontrols(Session["content"].ToString());
        base.OnPreRender(e);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        navn = Request.QueryString["id"];
     
        if (navn == null)
        {
            getIndhold(1);
        }
        else if (!IsPostBack)
        {
            int id = int.Parse(navn);
            getIndhold(id);

           
        }


    }
    public void getIndhold(int id)
    {
        string fromDb = "";
        string conn = SqlDataSource1.ConnectionString.ToString();
        SqlConnection myConn = new SqlConnection(conn);
        string sql = "SELECT indhold  FROM side WHERE id =" + id;

        SqlDataAdapter myAdp = new SqlDataAdapter(sql, myConn);
        DataSet ds = new DataSet();
        myAdp.Fill(ds, "side");
        myConn.Open();
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
          fromDb = dr["indhold"].ToString();
        }

        myConn.Close();
        replaceUsercontrols(fromDb);
       
    }

    public void replaceUsercontrols(string content)
    {
        Session["content"] = content;
        string sCommandList;
        string[] sCommandArray;
        string sControlName;

        sCommandList = content;
        sCommandList = sCommandList.Replace("[", "#[");
        sCommandList = sCommandList.Replace("]", "]#");
        char[] splitter = { '#' };
        sCommandArray = sCommandList.Split(splitter);
        for (int i = 0; i <= sCommandArray.Length - 1; i++)
        {
            if (sCommandArray[i].IndexOf("[") != -1)
            {
                sControlName = sCommandArray[i];
                sControlName = sControlName.Replace("[", "");
                sControlName = sControlName.Replace("]", "");
                if (sControlName == "nyheder")
                {
                    this.Controls.Add(new UserControl().LoadControl(sControlName + ".ascx"));
                }
                else if (sControlName == "nbrev")
                {
                    this.Controls.Add(new UserControl().LoadControl("uc/"+sControlName + ".ascx"));
                }
            }
            else
            {
                this.Controls.Add(new LiteralControl(sCommandArray[i]));
            }
        }
       
    }


}
mvh Brian
Avatar billede dr_chaos Nybegynder
06. december 2006 - 09:22 #11
jeg tror at du skal lave manuelle events for alle knapper.
altså ligesom man skulle i asp.net 1.1
Avatar billede brian-johansen Nybegynder
06. december 2006 - 09:24 #12
ok - det må jeg lige prøve at kigge på...
Tak for din hjælp

ligger du et svar ?
Avatar billede dr_chaos Nybegynder
06. december 2006 - 09:25 #13
gerne :)
Dynamiske kontroller giver altid nogle hovedbrud af den anden verden :/
Avatar billede brian-johansen Nybegynder
06. december 2006 - 09:27 #14
Jeg synes godt nok at jeg har læst mange artikler om det indtil videre, men de fortæller alle sammen hvordan man tilføjer dem, men ikke hvordan man bruger dem i i praksis, for der er jo ingen ide i det hvis man ikke kan lave postbacks.

mvh Brian
Avatar billede dr_chaos Nybegynder
06. december 2006 - 09:35 #15
Avatar billede brian-johansen Nybegynder
06. december 2006 - 09:39 #16
Nope... det må jeg da lige have læst igennem... tak for det..
Avatar billede dr_chaos Nybegynder
06. december 2006 - 10:15 #17
np :)
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