Avatar billede speedpete Nybegynder
05. august 2004 - 16:11 Der er 12 kommentarer og
1 løsning

Dymanisk tilføjede knapper: Man skal klikke to gange?

I denne indkøbsliste skal man kunne slette en vare ved at trykke på "Slet"-knappen, men det virker kun hvis man trykker to gange?
Hvordan får jeg det til at virke med ét tryk?


<%@ Page Language="C#" %>
<script runat="server">

    void Page_Load(Object Peter, EventArgs e)
    {
    if (! IsPostBack)
    {
    ArrayList l = new ArrayList();
    Session["liste"] = l;
    l.Add("Vare 1");
    l.Add("Vare b");
    l.Add("Vare 43ø");
    l.Add("Vare å");
    l.Add("Vare æselører");
    l.Add("Vare 6");
    l.Add("Vare sidst");
    }
    GenererListe();
    }

    void GenererListe()
    {
    ArrayList l=(ArrayList)Session["liste"];
    IEnumerator ole = l.GetEnumerator();
    while(ole.MoveNext())
    {
    Button btn = new Button();
    Label lbl = new Label();
    btn.Text = "Slet";
    lbl.Text = ole.Current.ToString();
    lbl.Width=200;
    btn.ID=ole.Current.ToString();
    Panel1.Controls.Add(lbl);
    Panel1.Controls.Add(btn);
    Panel1.Controls.Add(new LiteralControl("<br />"));
    btn.Click += new EventHandler(btn_Click);
    }
    }

    void btn_Click(object sender, EventArgs e) {
    ArrayList l = new ArrayList();
    l = (ArrayList)Session["liste"];
    l.Remove(""+((Button)sender).ID);
    Session["liste"] = l;
    }
   
</script>

<html>
<head>
</head>
<body>
    <form id="Form1" runat="server">
        <asp:Panel id="Panel1" runat="server"></asp:Panel>
    </form>
</body>
</html>
Avatar billede snepnet Nybegynder
05. august 2004 - 16:30 #1
Der er en forsinkelse på et roundtrip fordi page_load køres før din button-handler.
du bliver nødt til at sørge for at genopbygge dit view når du har ændret i listen.
Avatar billede snepnet Nybegynder
05. august 2004 - 16:33 #2
Egentlig kan du nok bare kalde genererliste i slutningen af din buttonhandler, men du skal nok lige sørge for at fjerne kontrollerne i panelet inden du smider dem ind igen.

er det bevidst at du ikke bruger databinding ?
Avatar billede speedpete Nybegynder
05. august 2004 - 20:14 #3
"Page_load køres før button-handler"? Har det da noget at sige, i hvilken rækkefølge de står i koden?

Det er bevidst at jeg ikke bruger databinding og DataGrid - jeg kan ikke finde ud af at få det til at virke. Jeg har prøvet med at tilføje BoundCoulumn inde i Columns inde i DataGrid, men jeg får en fejl om at BoundColumn er en forkert type.
Avatar billede snepnet Nybegynder
06. august 2004 - 08:38 #4
Ja det har rigtig meget at sige.

Som koden står nu - bygger du siden op fra page_load ved at kalde genererliste.
generer liste abbonnerer så på et event fra en knap.

når brugeren så klikker på knappen - køres din page_load igen, handleren tilføjes, og det udledes at der er trykket på knappen hvorved btn_Click kaldes.

btn_Click sørger så for at fjerne et element i den liste du har brugt til at bygge siden op eften, men siden bliver ikke bygget på ny, og derfor ser du siden på skærmen som den så ud da den blev bygget udfra den gamle liste.

du vil som nævnt sikkert kunne få det til at at virke hvis du i handleren slutter af med at kalde genererliste igen.... men genererliste bliver så nødt til at rydde op inden den sætter ind ved f.eks. Panel1.Controls.Clear();

Mvh
Avatar billede speedpete Nybegynder
06. august 2004 - 22:34 #5
Jeg har fået det til at virke ved at kalde btn_click igen, men hvordan ser den smarte måde at gøre det ud?
Avatar billede snepnet Nybegynder
06. august 2004 - 23:16 #6
Du kan få lidt brudstykker :

// når du nu har en sessionvariabel data
protected ArrayList PageData
{
    // returnerer nu null, hvis der ikke er noget - men du kunne have en defaultværdi her
    return (object)Session["Liste"] != null ? (ArrayList)Session["Liste"] : null;
}

// du kan så i din aspx-kode have noget du kan databinde til...
// et datagrid er supernemt at starte med
<asp:DataGrid id="dg" runat="server"></asp:DataGrid>

// Og du kan så sørge for at fylder griddet med data fra din liste
<asp:DataGrid id="dg" runat="server" DataSource="<%# Liste %>"></asp:DataGrid>

// hvis du bruger visual studio vil du så i din codebehind få :
protected DataGrid dg;

// i page_load sørger du så for at udføre databindingen
// desuden skal du så have tilknytte din handler som tidligere
if(!IsPostBack)
    dg.DataBind(); // sørger for at

// og i din handler ændrer du så på listen f.eks.
Liste.Add("Halløjsa der");
// og kalder efterfølgende
dg.DataBind(); // Det vil så sørge for at opdatere listen, som du kommer til at se

Er du med på den ?

Mvh
Avatar billede speedpete Nybegynder
07. august 2004 - 10:19 #7
Ikke helt, men jeg prøver at kigge på det - jeg har ihvertfald forstået arbejdsgangen i den kode jeg havde før, så jeg kan godt se, hvorfor det ikke virkede ordentligt.

Mht. DataGrid, så kan jeg sagtens finde ud af at databinde en simpel ArrayList, men jeg vil gerne have nogle Buttons for hver Item i listen - jeg har prøvet at omarbejde et eksempel fra min lærebog (Programming ASP.NET), hvor der i DataGrid tilføjes hyperlinkkolonnerm, til noget à la:

<asp:DataGrid>
  AutoGenerateColumns = "False"
  <Columns>
      <asp:BoundColumn ............>
      <asp:ButtonColumn .......... >
  </Columns>
</asp:DataGrid>

Men compileren protesterer og siger at Columns ikke kan indeholde BoundColumn (eller er det ButtonColumn - kan ikke lige huske hvilken)
Avatar billede snepnet Nybegynder
07. august 2004 - 11:10 #8
Der skulle ikke gerne være noget ballade med noget af det - du får lige et lille eksemple her :

<asp:DataGrid id="DemoGrid" DataSource="SomeData" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundColumn DataField="SomeDataField"></asp:BoundColumn>
        <asp:ButtonColumn Text="Select" CommandName="Select"></asp:ButtonColumn>
    </Columns>
</asp:DataGrid>
Avatar billede snepnet Nybegynder
13. august 2004 - 18:21 #9
hvordan går det her speedpete ?
Avatar billede speedpete Nybegynder
23. august 2004 - 21:30 #10
jeg er ikke kommet videre med datagrid. det andet virker fint.

Skal du have nogle points? jeg ved ikke helt hvordan det virker.

jeg har først fået mailen fra d. 7/8 idag - der er klumper i strømmen hos get2net...
Avatar billede snepnet Nybegynder
23. august 2004 - 21:32 #11
lolz... det er da nogle klumper der vil noget :o)
det virker sådan at jeg giver dig et svar :
Avatar billede snepnet Nybegynder
23. august 2004 - 21:32 #12
svar
Avatar billede snepnet Nybegynder
23. august 2004 - 21:33 #13
og så skulle du får mulighed for at klikke på mig en et eller andet felt, så det bliver markeret, og trykke accepter (eller noget i den stil).
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