webForumDet fria alternativet

Få dynamiska kontroller att köra metod

.NET

8 svar · 376 visningar · startad av fredrik

Medlem sedan dec. 19991 072 inlägg
Frågan#1

Jag använder "Calendar"-kontrollen och dess "dayRender"-händelse för att visa upp en almanacka där varje dag kan innehålla olika aktiviteter.

Vid klick på en aktivitet visas en ny panel upp med information om den aktuella aktiviteten.

I "dayRender" kollar jag om det finns någon aktivitet och om det finns så lägger jag till en "Hyperlink"-kontroll i kalender-cellen.

Frågan är bara: Hur kan jag få min dynamiska hyperlink kontroll att köra en metod?

I nuläget har jag löst det med att jag via javascript ändrar värde i en "hidden"-box och sen submittar formuläret. i "_Load" kollar jag sen om "request.form("hidID")" innehåller något.

Detta känns dock lite "stökigt", jag vill hellre sköta det med en vanlig postback till en metod.

Nån som har någon lösning?

Medlem sedan maj 20012 812 inlägg
#2

Om du istället för Hyperlink använder dig av LinkButton, så får du tillträdde till onClick eventet om det är det du vill.

Så här hade jag löst problemet om jag förstått dig rätt.

1. Skapat en LinkButton istället för HyperLink.
2. Lagt till ett Attribute i LinkButton, som jag döpt till: MethodToRun
3. Läggt in methodnamnet för den method som skall göras i attributet MethodToRun.
4. I onClick-eventet för LinkButton så hade jag plockat ut namnet på methoden i attributet: MethodToRun.
5. Använt mig av reflextion för att köra just den methoden som du vill.

Fördelar: Otroligt smidig lösning, om du vill kunna ha fler methoder att köra, så behöver du bara skapa methoden och sedan lägga in namnet i MethodToRun. Inga switch-case satser behöver underhållas så namnet och methoden stämmer överens.

Nackdel: Lite kluddigare att implementer, använder reflextion som är lite långsammare än en swtich-case sats.

- M

Medlem sedan sep. 20011 914 inlägg
#3

Har gjort så här på en kalender.
Vid eventet dayrender så kollar jag mot en datakälla om den dagen har någon info, om så, så lägger jag till något till den dagen som indikerar att det finns info. Behöver ju inte lägga till någon linkbutton för det har ju varje dag som default.

e.Cell.Controls.Add(new LiteralControl("Jag har info."))
e.Cell.BackColor = System.Drawing.Color.FromName("pink")

Bredvid kalendern ha jag en tabel med labels där jag kan visa upp infon.

Sen i SelectionChanged eventet så tar jag ut info om dagen har "pink" bakgrundsfärg, alltså den har info, med

If calNotes.SelectedDayStyle.BackColor.ToString = "Pink" Then
   'Hämta data för dagen kalendernamn.SelectedDate.Day
end if

och binder det till label. Funkar hur fint som helst.

Medlem sedan dec. 19991 072 inlägg
#4

Dino:
Jag har flera aktiviteter per dag, och jag vill att man ska kunna klicka på varje enskild aktivitet. Hade nog funkat bra annars! Tack ändå.

Gladh:
Hur kommer jag åt "OnClick" händelsen för en link-button som jag skapar dynamiskt? Om jag deklarerar en linkbutton-variabel, så syns inte onClick i listan?

Om jag lägger till ett attribut blir väl det på klient-sidan?

Jag hänger inte riktigt med på hur jag ska fånga upp metod-namnet igen efter klick?

Tack på förhand!

Medlem sedan maj 20012 812 inlägg
#5

Har faktiskt aldrig gjort det men följande kod borde göra vad du vill :)

			LinkButton o = new LinkButton();
			this.o.Click += new System.EventHandler(this.ON_CLICK_LINKBUTTONS_NAMN);
	
		o.Attributes["MehtodToRun"] = "METHOD_TO_RUN_NAMN";

Här skapar du en linkbutton dynamsikt (glöm inte att lägga den på sidan). Du berättar också att vid ett System.EventHandler så skall man köra en specifik method.

Sedan skapar jag ett attribut som läggs till i HTML-koden men som man även kan få fram i sin kod i onClick-eventet.

- M

Medlem sedan dec. 19991 072 inlägg
#6

Hmm...nu gör jag iof detta i vb.net...men det borde väl vara samma...

Jag använder då "AddHandler" för att tilldela händelsen rätt metod. Problemet är att den struntar i det...den blir inte ens klickbar...

Medlem sedan maj 20012 812 inlägg
#7

Läste på lite mer, och konstaterade att så kan man inte gör :(

Tyvärr försvinner ju din kontroll när du gör en postback, och eftersom kontrollen inte finns längre så kan man inte göra något event på den.

Fick dock fram om man lägger in knappen i Page.Init eventet så finns den tillgänglig och då körs eventet, här kommer lite kod i C#

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 WebApplication4
{
	/// <summary>
	/// Summary description for WebForm1.
	/// </summary>
	public class WebForm1 : System.Web.UI.Page
	{
		protected Panel panel;

		private void Page_Init(object sender, System.EventArgs e){
			//-- add linkbutton dynamic
			LinkButton oLinkButton = new LinkButton();
			oLinkButton.Text = "Click Me";
			oLinkButton.ID = "ClickMe";
			oLinkButton.Attributes["MethodToRun"] = "TestMethod";
			oLinkButton.Click += new System.EventHandler(this.ClickMe_onClick);
			panel.Controls.Add(oLinkButton);
		
		
		}
		private void Page_Load(object sender, System.EventArgs e)
		{
		}

		protected void ClickMe_onClick(object sender, System.EventArgs e){
			string s = ((LinkButton)sender).Attributes["MethodToRun"].ToString();
		}

		#region Web Form Designer generated code
		override protected void OnInit(EventArgs e)
		{
			//
			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
			//
			InitializeComponent();
			base.OnInit(e);
		}
		
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{   
			this.Init += new System.EventHandler(this.Page_Init);
			this.Load += new System.EventHandler(this.Page_Load);
		}
		#endregion
	}
}

Nu är det ju inte så smart att lägga alla kontroller i Page.Init eftersom du säkert inte vet vilka kontroller som skall visas i Page.Init eventet.

Jag lyckades dock klura ut att det räcker med att lägga till följande i Page.Init för att det skall fungera som du vill.

		private void Page_Init(object sender, System.EventArgs e){
			//-- add linkbutton dynamic
			LinkButton oLinkButton = new LinkButton();
		}
		private void Page_Load(object sender, System.EventArgs e)
		{
			LinkButton oLinkButton = new LinkButton();
			oLinkButton.Text = "Click Me";
			oLinkButton.ID = "ClickMe";
			oLinkButton.Attributes["MethodToRun"] = "TestMethod";
			oLinkButton.Click += new System.EventHandler(this.ClickMe_onClick);
			panel.Controls.Add(oLinkButton);

			oLinkButton = new LinkButton();
			oLinkButton.Text = "Click Here";
			oLinkButton.ID = "ClickHere";
			oLinkButton.Attributes["MethodToRun"] = "TestMethod_2";
			oLinkButton.Click += new System.EventHandler(this.ClickMeHere_onClick);
			panel.Controls.Add(oLinkButton);
		}

Här skapar jag mina kontroller i Page_Load, men skapar även en knapp i Page.Init. Varför det fungerar vet jag inte, men det gör det :)

- M

Medlem sedan dec. 19991 072 inlägg
#8

Tack!

Det funkar perfekt!

Jag hoppar däremot attributet "MethodToRun", då jag bara behöver koppla min knapp till en metod.

Medlem sedan sep. 20011 914 inlägg
#9

Hur löser man det i vb.net? Har testat att omvandla koden, men då får jag

public event click is an event, and cannot be called directly. Use a "RaiseEvent" statement to raise an event

252 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)