Avatar billede noobsaibot Nybegynder
23. september 2005 - 03:07 Der er 38 kommentarer og
1 løsning

Imagebutton add/remove usercontrol

Jeg har et problem med en imagebutton.
Jeg vil gerne have at der bliver add'et en usercontrol når brugeren trykker 1. gang og at den samme usercontrol bliver fjernet når brugeren trykker 2. gang.

Jeg har skrevet følgende kode:

    private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
        {
           
            if (phMenu1.Controls.Count == 0)
            {
                phMenu1.Controls.Add(LoadControl("/test/UC.ascx"));

            }
            if (phMenu1.Controls.Count != 0)
            {
                phMenu1.Controls.Clear();   
            }
           
           
        }


Problemet med min kode er at: først add'es uc'en men bliver slettet med det samme igen ..
Hvordan løser jeg problemet?
Avatar billede snepnet Nybegynder
23. september 2005 - 08:24 #1
det nemmeste er at styre visibility på den. dynamisk tilføjede kontroller skal tilføjes hver gang, hvilket vil sige at den eneste situation du får sat user-kontrollen ind i, er når brugeren trykker på knappen.

mvh
Avatar billede snepnet Nybegynder
23. september 2005 - 08:30 #2
Avatar billede thrytter Nybegynder
23. september 2005 - 10:26 #3
Fejlen skyldes at du har 2 if-sætninger, og at begge gennemløbes når brugeren trykker på billedet.

Skulle virke bedre hvis de 2 if-sætninger erstattes med en if-else ala.

if (phMenu1.Controls.Count == 0)
{
  phMenu1.Controls.Add(LoadControl("/test/UC.ascx"));
}
else
{
  phMenu1.Controls.Clear();   
}
Avatar billede noobsaibot Nybegynder
23. september 2005 - 10:47 #4
Ja .. skulle jeg mene .. men det gør det ikke
Avatar billede snepnet Nybegynder
23. september 2005 - 10:50 #5
i den kode du har der er det eneste der kan afstedkomme at user-kontrollen indsættes, at brugeren trykker på knappen.
der er ikke nogen mekanisme der husker kontrollen, så prøv dennis bauers panel, styr det på visibility, eller gem en parameter der fortæller om den skal indsættes.
(det sidste kan gøres i viewstate, session, querystring mv).
mvh
Avatar billede noobsaibot Nybegynder
23. september 2005 - 10:58 #6
men den kører vel kun en session?
Avatar billede snepnet Nybegynder
23. september 2005 - 11:04 #7
mmm... jeg forstod ikke spørgsmålet.

jeg mente bare, at du kunne lægge en parameter et sted (f.eks. i session), og så bruge den til at fortælle om kontrollen skal indsættes eller ej.

// sessionproperty
protected bool ShowControl
{
  get
  {
    return (object)Session["ShowControl"] != null ? (bool)Session["ShowControl"] : false:}
  }
  set
  {
    Session["ShowControl"] = value;
  }
}
så kunne du i din page_load have noget i denne stil :

if(ShowControl)
{
  phMenu1.Controls.Add(LoadControl("/test/UC.ascx"));
}

din handler kunne så :
private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
  if(ShowControl)
    ShowControl = false;
  else
    ShowControl = true;
  Response.Redirect(Request.RawUrl); // så siden opdateres*
}

*kan godt gøres lidt vaksere, men du kan lige starte med det, og se hvad der sker.

mvh
Avatar billede noobsaibot Nybegynder
23. september 2005 - 11:06 #8
tak - jeg kigger på det.
Avatar billede snepnet Nybegynder
23. september 2005 - 11:08 #9
du spørger bare hvis der er noget, og som sagt - hvis det blot er et spørgsmål om hvorvidt én enkelt kontrol skal vises eller ej, så er det enklere blot at styre visibility.
mvh
Avatar billede noobsaibot Nybegynder
23. september 2005 - 11:18 #10
tak :)
Ja det er det jo lige i min testfase - kunne godt gå hen at blive flere controls ..
Avatar billede snepnet Nybegynder
23. september 2005 - 11:21 #11
ok - du må jo bare prøve dig lidt frem, og se hvad du synes bedst om, og spørg bare løs hvis du går i stå.
mvh
Avatar billede noobsaibot Nybegynder
23. september 2005 - 16:43 #12
Må indrømme at jeg ikke er særlig god til ASP.NET .. Hvor ligger jeg sessions variable?
Avatar billede snepnet Nybegynder
23. september 2005 - 17:03 #13
det er rimelig enkelt - sådan grundlæggende kan du gøre sådan her :

// put noget i session
Session["etellerandetnavn"] = enellerandenvariabel;

// få fat i det igen
enellerandenvariabel = Session["etellerandetnavn"];

men... da du kan lægge alle typer af objekter i session vil du vanligvis skulle caste til den type du har lagt i - f.eks.:

// prop en integer i session
Session["daystorelease"] = 100;

// og hent den igen
int dtr = (int)Session["daystorelease"];

i den kode du fik før, har jeg bare pakket adgangen til session-variablen ind i en property, hvilket jeg gerne vil anbefale.

protected bool ShowControl
{
  get
  {
    return (object)Session["ShowControl"] != null ? (bool)Session["ShowControl"] : false:}
  }
  set
  {
    Session["ShowControl"] = value;
  }
}

mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 00:58 #14
hvor skal jeg ligge bool ShowControl?

vil ikke loade en usercontrol med det samme når siden loades .. kun hvis der trykkes på knappen .. Så skal jeg vel ikke lægge noget i page load?

:)
Avatar billede snepnet Nybegynder
24. september 2005 - 01:09 #15
jo hvis du bruger den model fra 23/09-2005 11:04:17.
trykket på knappen sætter en variabel, hvorefter der reloades. i page_load sættes kontrollen ind, hvis variablen er sat.
mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:10 #16
okay ..
Vil du forklare mig hvor sessionvariablen skal ligge?
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:24 #17
Forstår ikke det her:

    protected bool ShowControl
        {
            get
            {
                return (object)Session["ShowControl"] != null ? (bool)Session["ShowControl"] : false;}
            }
            set
            {
                Session["ShowControl"] = value
            }
        }

Kan heller ikke smide det ind i VS - får røde streger over det hele..
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:27 #18
Jeg forstår følgende af koden:

- Jeg har en bool var der hedder Showcontrol.
- Der er en get prop (returnerer en sessionsvar der hedder ShowControl som er forskellig fra null)
- Der er en set prop ..
Avatar billede snepnet Nybegynder
24. september 2005 - 01:29 #19
hvis sessionvariablen er der (!=null) returneres værdien som en bool, ellers returneres false.
og ganske rigtigt en setter.

du skal placere det i koden på samme måde som en metode (det er ikke noget kode du f.eks. kan skrive inde i page_load.

mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:30 #20
Session["ShowControl"] = value;

betyder bare at man kan sætte en value?
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:34 #21
namespace test
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.ImageButton ImageButton1;
        protected System.Web.UI.WebControls.Button Button1;
        protected System.Web.UI.WebControls.Label Label1;
        protected System.Web.UI.WebControls.PlaceHolder phMenu1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(ShowControl)
            {
                phMenu1.Controls.Add(LoadControl("/test/UC.ascx"));
            }

        }

               
        protected bool ShowControl
        {
            get
            {
                return (object)Session["ShowControl"] != null ? (bool)Session["ShowControl"] : false:}
            }
            set
            {
            Session["ShowControl"] = value;
            }
        }

        private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
        {
       
           
            if(ShowControl)
            {
                ShowControl = false;
            }
            else
            {
                ShowControl = true;
                Response.Redirect(Request.RawUrl);
            }   
        }
   
       


        private void Button1_Click(object sender, System.EventArgs e)
        {
            if (phMenu1.Controls.Count != 0)
            {
                phMenu1.Controls.Clear();   
            }
        }
       

    }
}
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:40 #22
Okay  :) har fået det til at virke - delvist ..

Kan godt indsætte usercontrolen - men jeg kan ikke få det fjernet igen.
Avatar billede noobsaibot Nybegynder
24. september 2005 - 01:50 #23
return (object)Session["ShowControl"] != null ? (bool)Session["ShowControl"] : false;


- Hvad betyder "?" i ovenstående kode?
Avatar billede snepnet Nybegynder
24. september 2005 - 01:56 #24
det er en conditional operator, og det er både ? og : der indgår.

// MSDN
The conditional operator (?:) returns one of two values depending on the value of a Boolean expression. The conditional operator is of the form.
condition ? first_expression : second_expression;
//

value er den værdi man kommer anstigende med - f.eks. ved dette udtryk:

ShowControl = true; //medfører at value er true i din setter

ups:
if(ShowControl)
{
  ShowControl = false;
}
else
{
  ShowControl = true;
}
Response.Redirect(Request.RawUrl);

håber jeg fik det hele med :o)

mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 02:04 #25
hehe .. ja jeg har mange spm. Men nu virker  det .. :) Mange tak for hjælpen!
Kan ikke lige hitte ud af hvad der er condition, first expr og second expr..

condition = (object)Session["ShowControl"] != null ?
first expr = (bool)Session["ShowControl"] : false


eller ..?

Smid et velfortjent svar :)
Avatar billede noobsaibot Nybegynder
24. september 2005 - 02:11 #26
Response.Redirect(Request.RawUrl) behøves vel ikke idet Imagebutton automatisk udfører postback (når siden loades igen bestemmes det hvorvidt userctrol'en skal vises)
Avatar billede noobsaibot Nybegynder
24. september 2005 - 02:15 #27
Og dog .. ellers bliver UC ikke vist første gang man trykker
Avatar billede snepnet Nybegynder
24. september 2005 - 02:34 #28
nej du bliver nødt til at reloade siden - din eventhandler kører efter page_load.

(object)Session["ShowControl"] != null ? (bool)Session["ShowControl"] : false;

kan du læse som:

hvis Session["ShowControl"] ikke er null, så returner Session["ShowControl"] castet til en bool, ellers returner false.

<udtryk> ? <returners hvis udtryk er true> : <returneres hvis udtryk er false>

mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 02:36 #29
Ahh.. okay.
Cool. Mange tak for din hjælp + tålmodighed :)
Avatar billede snepnet Nybegynder
24. september 2005 - 11:05 #30
det var så lidt :o)
har du fået det til at virke så?
mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 13:20 #31
Yes. Det virker helt fint.
Har indsat en knap mere og en sessionsvariabel mere efter samme princip.

(object)Session["ShowControl"] er vel et array ikke?
Hvis ja - hvordan hiver jeg noget ud af sådan et array fra en bestemt plads?
Avatar billede snepnet Nybegynder
24. september 2005 - 13:38 #32
Hvis du vil have fat i noget på en bestemt plads, kan du bare :

object var = Session[0]; // henter det første element

og du kan også tage en kigger på hvad du har i session - f.eks. sådan her:

foreach (string key in Session.Keys)
{
    string variablname = key;
    Type variabeltype = Session[key].GetType();
}

Sessiontypeklassen er baseret på den øverste type i hierarkiet (object), men implementerer et interface der hedder ICollection - så det betragtes vanligvis blot som en collection... en collection af objects.

såhh... hvis du vil tilføje noget til din session, kan du også gøre sådan her:

Session.Add("someName", someObject);

og grunden til at du kan gøre sådan her

Session["varname"] / Session[index]

er fordi der er implementeret to indexere på klassen HttpSessionState, som er den type Session er.

mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 13:41 #33
okay tak!
Har søgt som en gal for at finde en syntax-oversigt på nettet, men kunne ikke finde nogen. Har du et godt link?
Avatar billede noobsaibot Nybegynder
24. september 2005 - 13:48 #35
Søgte også der, men tak for tipet!
Avatar billede snepnet Nybegynder
24. september 2005 - 13:50 #36
er det sådan noget her du mangler:
http://msdn.microsoft.com/vcsharp/programming/language/
mvh
Avatar billede noobsaibot Nybegynder
24. september 2005 - 16:55 #37
jamen jeg ville gerne have et sted hvor jeg fx selv kunne have slået op hvordan man arbejder med det sessionsarray.. så er jeg fri for at stille spm hele tiden :)
Avatar billede snepnet Nybegynder
24. september 2005 - 19:08 #38
Avatar billede snepnet Nybegynder
24. september 2005 - 19:09 #39
(der kan du så klikke videre fra)
mvh
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