19. april 2007 - 13:33Der er
8 kommentarer og 1 løsning
Få CommandName fra Request.Form
Jeg har en dynamisk tabel, incl nogle ImageButtons.
Efter postback, gentegnes tabellen, men på en måde som afhænger af hvilken ImageButton jeg klikkede.
Jeg har brug for at kende værdierne af COmmandName og CommandArgument for den klikkede button inden jeg kan gentegne tabellen. Derfor kan jeg ikke bruge OnCOmmand-eventet, da det først eksekverer efter page load.
Jeg kan identificere knappen fra Request.FORM, men ved ikke hvor dens CommandName og CommandArgument er gemt (formentligt også i Request.Form) - hvor er de ?
Ok - nu har jeg fundet ud af at den ønskede info gemmer sig i ViewState. Nogen som ved hvordan man kan få information for en navngiven kontrol ud af viewstate ? Det er en ImageButton, og jeg vil gerne have fat i CommandArgument og CommandName. Har forsøgt alskens kunster efter timers søgning på nettet, men kan ikke helt se hvordan man skal gøre det.
hehe jo, hvis eventet blev trigget ! Sagen er at kontrollen ikke er blevet genskabt endnu - fordi den er i tabellen som jeg skal til at tegne. CommandArgument skal bestemme hvor mange linjer jeg skal tegne, og det er tænkeligt at min kontrol slet ikke kommer med. Desuden, dens event kører jo først efter pageload !.
Mit problem barberet ned til det essentielle ser sådan ud :
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim NumberOfLines As Integer
if NOT Page.IsPostBack Then NumberOfLines = some_default_value Else NumberOfLines = GetNumberOfLines() End If
DrawTable(NumberOfLines)
End SUb
Private Sub DrawTable(ByVal NumberOfLines As Integer)
Dim r As System.Web.UI.WebControls.TableRow Dim c As System.Web.UI.WebControls.TableCell
For LineNo As Integer = 1 To NumberOfLines r = New System.Web.UI.WebControls.TableRow() c = New System.Web.UI.WebControls.TableCell()
MyIMG = New ImageButton MyIMG.CommandName = "State" MyIMG.CommandArgument = "Off" MyIMG.ImageUrl = "~/img/Unselected.gif" MyIMG.ID = "img" & LineNo.ToString & "+" & DayNumber.ToString ' Day number is something from a column - I shaved it away for this demo MyIMG.Visible = True AddHandler MyIMG.Command, AddressOf MyIMG_Command c.Controls.Add(MyIMG) r.Cells.Add(c) Table1.Rows.Add(r) Next End Sub
Private Function GetNumberOfLines() As Integer Dim NumberOfLines As Integer ' here I calculate NumeberOfLines ' If an MyIMG-button was clicked - the number of lines may change, depending on the contents of ' the buttons CommandArgument ' If, eg., NumberOfLines was 10 and now shall be 5, the actual clicked button control (which was in line 8) will not be drawn, which means it's OnCommand event handler will never fire
Return NumberOfLines End Function
Jeg kan jo naturligvis selv gemme parametrene for alle mine ImageButtons i ViewState og få fat i dem efter postback, men troede man kunne hive dem ud af den af frameworket etablerede viewstate , på en eller anden måde, inden den kontrol som de tilhører er blevet genskabt.
hvad så med at knytte et click-event på din imagebutton og så flytte genereringen af tabellen fra din page_load ned i dit click-event.
Har du flere ImageButtons kan du sagtens lade alle benytte sig af samme click-event, og ved at caste sender til en ImageButton vil du få fat i dit CommandArgument for den pågældende knap der blev trykket på.
Hvad med at lave noget javascript sætte værdien af dit CommandArgument til et HiddenField lige før postback, som du så kan forespørge på ved Page_Load?
"knytte et click-event på din imagebutton " er præcist det jeg ikke kan. Hvis tabellen IKKE er genereret, så er der ingen klik-event, fordi min ImageButton endnu ikke eksisterer. Jeg laver en del i PreRender i anden sammenhæng, men lige netop dette kan man ikke desværre :-(.
(I realiteten HAR jeg et event på den, fordi med visse værdier af Commandargument har tabellen uændret antal rækker, og i det tilfælde funker det fint at tegne tabellen og derpå behandle mit OnCommand event. For andre værdier skal tabellle gentegnes med et andet antal rækker , og det er så her jeg render ind i "chicken and egg"- problemet).
Din idé med Javascript er fin - jeg er bare ikke stærk nok i JS til at kunne gøre det umiddelbart. Det er noget jeg så lige skal læse lidt på.
Et alternativ er selv eksplicit at gemme CommandArgument for alle mine ImageButtons i ViewState, da jeg jo kan finde ud af hvilken af dem der blev klikket på i Request.From, og derpå retrieve fra ViewState de ønskede værdier. Sagen er jeg har en rimelig stor viewstate i forvejen, og kan snildt ende med 500 knapper - og arbejder på at blive helt af med viewstate faktisk. Måske vil dit forslag gøre det muligt helt at dræbe viewstate.
1) opret en function: function setCommandValue(val) 2) lav en onclick på din ImageButton: onclick="return setCommandValue(1);" 3) få en reference til din hidden control: var hidden = document.getElementById('<% hidden.ClientID %>'); 4) smid argumentet i funktionen på din hidden-control: hidden.value = val; 5) returner false;
ie.
function setCommandValue(val) { var hidden = document.getElementById('<% hidden.ClientID %>'); hidden.value = val; return false; }
MyIMG = New ImageButton MyIMG.Attributes.Add("onclick", "return writeCommandValue('State');")
Hej igen - blev nødt til at sætte dét lille delprojekt on the backburner, fordi det drejede sig om en ekstra facilitet som ville være "nice to have" snarere end "must have" Men senere kan jeg implementere det som du foreslår. Husk lige at lægge et svar nu - tak for hjælpen:)
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.