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.
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);
}
}
}
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?
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.
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"))
Jeg har ikke rettet
btn.CommandName = "snydeklik"
hvilket jeg har fornemmelsen af at jeg skal, men til hvad?
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.
Da jeg har indlæst det som en control kommer informationerne jo kun til forsiden og ikke videre til controllen.
Forøvrigt forstod jeg ikke hvad btn.CommandName="snydeklik" gjorde... Men nu virker det. Endnu engang - mange tak.
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...