20. marts 2004 - 10:35Der er
10 kommentarer og 1 løsning
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)
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();
// 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); }
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);
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.
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.
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...
Synes godt om
Ny brugerNybegynder
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.