Oprettet lør. d. 20. marts 2004 kl. 10:35:01

wired
wired (14.460 point. Point ude: 1.610)

Bind en onclick fra en row til code-behind

Jeg vil gerne at man kan klikke på rækken(row) og at det bliver sendt over til serversiden, men at server-siden skal modtage det som var det en link-button.

Jeg har lavet følgende:

  Dim KT As New Table
  Dim KR As New TableRow
  KT.Controls.Add(KR)
 
  ' Skal jeg
  KR.attribute.add("onclick",Page.load)

  ' eller skal jeg
  AddHandler Kr.Onclick, Page.load

  Dim KC1 As New TableCell
  KC1.text = "cell1"
  KR.Controls.Add(KC1)

Skrevet lør. d. 20. marts 2004 kl. 14:00:53| #1

snepnet
snepnet (87.110 point)
Det er ikke helt fint i kanten det du har skrevet, men det kan godt lade sig gøre på en rimelig enkel måde. Du får lige en kodestump om 5 min.

Skrevet lør. d. 20. marts 2004 kl. 14:10:46| #2

snepnet
snepnet (87.110 point)
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Snippets.EkspertenTries
{
    public class AddOwnClientreference : System.Web.UI.Page
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            // en tabel
            Table tbl = new Table();
            TableRow tr = new TableRow();
            TableCell tc1 = new TableCell();
            TableCell tc2 = new TableCell();
            TableCell tc3 = new TableCell();
            TableCell tc4 = new TableCell();

            // lidt styles
            tbl.BorderStyle = BorderStyle.Solid;
            tbl.BorderWidth = 1;
            tbl.Width = 450;
                       
            // knappen der benyttes
            LinkButton btn = new LinkButton();
            btn.CommandArgument = "someArgument";
            btn.CommandName = "snydeklik";
            btn.Click += new EventHandler(btn_Click);           
            btn.Visible = false;

            // dummytekster
            tc1.Text = "bla";
            tc2.Text = "bla";
            tc3.Text = "og bla";

            // ind med dummycellerne
            tr.Cells.Add(tc1);
            tr.Cells.Add(tc2);
            tr.Cells.Add(tc3);           
           
            // knappen ind i en usynlig celle
            tc4.Visible = false;
            tc4.Controls.Add(btn);
            tr.Cells.Add(tc4);

            // lidt mouseoverfis...
            tr.Attributes.Add("onmouseover", "this.style.background=\"#c0c0c0\"");
            tr.Attributes.Add("onmouseout", "this.style.background=\"#ffffff\"");
           
            // ind med rækken
            tbl.Rows.Add(tr);

            // tabellen smides ind på siden           
            this.Controls[1].Controls.Add(tbl);
       
            // når sagerne er smidt ind i kontroltræet kan du lave dette lille trick
            tr.Attributes.Add("onclick", this.GetPostBackEventReference(btn, "testargument"));
        }

        // handler for knappen
        private void btn_Click(object sender, EventArgs e)
        {
            // fyrer den for dit TableRow... du kan self bare lave det hele her hvis du hellere vil det
            OnRowClicked((LinkButton)sender, e);
        }

        // handler for rækken
        private void OnRowClicked(LinkButton sender, System.EventArgs e)
        {
            Response.Write("[CommandName : " + sender.CommandName+ "] [Argument : " + sender.CommandArgument + "]");
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }
    }
}

Skrevet lør. d. 20. marts 2004 kl. 14:31:34| #3

wired
wired (14.460 point)
Ok... Jeg prøver lige.. Det ser ud til at du har styr på det.

Hvordan får du lige
  btn.Click += new EventHandler(btn_Click);
over til vb.net?

Skrevet lør. d. 20. marts 2004 kl. 16:10:06| #4

wired
wired (14.460 point)
Ok
  btn.Click += new EventHandler(btn_Click);
erstattes med
  AddHandler btn.Click, AddressOf btn_Click

og
  this.Controls[1].Controls.Add(tbl);
med
  Controls.Add(KursusTabel)

og
tr.Attributes.Add("onclick", this.GetPostBackEventReference(btn, "testargument"));
med
tr.Attributes.Add("onclick", page.GetPostBackEventReference(btn, "testargument"));


Mennnn
OnRowClicked((LinkButton)sender, e);
og
InitializeComponent();
base.OnInit(e);

Er jeg ikke sikker på at jeg forstår.

Skrevet lør. d. 20. marts 2004 kl. 16:19:23| #5

wired
wired (14.460 point)
Den hopper ikke ned i btn_Click

client-siden skriver:
  onclick="__doPostBack('','testargument')"

Så der må være noget galt i:
  tr.Attributes.Add("onclick", Page.GetPostBackEventReference(btn, "testargument"))

Skrevet lør. d. 20. marts 2004 kl. 16:20:42| #6

wired
wired (14.460 point)
Jeg har ikke rettet
btn.CommandName = "snydeklik"
hvilket jeg har fornemmelsen af at jeg skal, men til hvad?

Skrevet lør. d. 20. marts 2004 kl. 17:29:32| #7

snepnet
snepnet (87.110 point)
Der er ikke nødvendigvis noget galt i dit kald, men tilsyneldende kendes knappens  clientid ikke på det tidspunkt du laver det (det er derfor du får  onclick="__doPostBack('','testargument')" istedet for  onclick="__doPostBack('<et eller andet clientid>','testargument')".
Det er derfor det er vigtigt at du først refererer til knappen efter den er lagt ind pageobjektets kontroltræ... Ellers er clienid ikke kendt.

Nu ved jeg jo ikke lige hvordan din kode er bygget op, men hvis du vil bruge det clientid der autogereneres kan du benytte min kode direkte (i et c# projekt :), eller forsøge dig med  - alternativt kan du tildele et id selv (btn.ID = "whatever").

OnRowClicked((LinkButton)sender, e) er bare en metode jeg selv så det bliver sådan lidt lookalike :) - jeg kalder den jo også bare fra handleren for knappen med et typecast således at du kan tilgå command-senderen som en LinkButton.

CommandName kan du bruge til at angive hvilket kommando du ønsker eksekveret når der trykkes... du kunne så i handleren måske have en switch på commandname ell. Det er bare en mulighed.

Håber det gav mening... ellers må du lige skrive igen.

Skrevet lør. d. 20. marts 2004 kl. 19:07:30| #8

wired
wired (14.460 point)
Fedt.. Det var netop ID der var problemet. Havde givet tc4 id og ikke btn.
Nu skal jeg bare have videreført det til min control men det kræver et nyt spørgsmål.
Mange tak for hjælpen.

Skrevet lør. d. 20. marts 2004 kl. 19:10:42| #9

wired
wired (14.460 point)
Da jeg har indlæst det som en control kommer informationerne jo kun til forsiden og ikke videre til controllen.

Skrevet lør. d. 20. marts 2004 kl. 19:14:45| #10

wired
wired (14.460 point)
Forøvrigt forstod jeg ikke hvad btn.CommandName="snydeklik" gjorde... Men nu virker det. Endnu engang - mange tak.

Skrevet lør. d. 20. marts 2004 kl. 19:46:37| #11

snepnet
snepnet (87.110 point)
Det er bare en strengvariabel som du så kan samle op senere, hvis du skulle have lyst... det bruges bl.a. i forbindelse med eventbubbling...

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

GridView og RowCommand

Oprettet den 22. maj 2012 kl. 17.34
faran giver 30 point for svar | Giv et svar »

Flere betingelser i repeater.

Oprettet den 15. maj 2012 kl. 21.45
fuldstop giver 60 point for svar | Giv et svar »

kombinere code behind og Javascript

Oprettet den 6. maj 2012 kl. 09.02
tjacob giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger