Avatar billede neoman Novice
19. april 2007 - 13:33 Der 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 ?
Avatar billede neoman Novice
19. april 2007 - 20:25 #1
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.
Avatar billede burningice Nybegynder
20. april 2007 - 01:03 #2
Du kan caste din control til en ImageButton og på den måde hente dens CommandName ud.

c#:
ImageButton btn = (ImageButton)sender;
string commandName = btn.CommandName;
Avatar billede neoman Novice
20. april 2007 - 11:21 #3
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.
Avatar billede burningice Nybegynder
20. april 2007 - 14:32 #4
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?
Avatar billede neoman Novice
20. april 2007 - 15:15 #5
"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.
Avatar billede burningice Nybegynder
20. april 2007 - 17:12 #6
Det er ikke så svært med javascripten.

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');")

og du kan så hente værdien på serveren sådan her

hidden.Value
Avatar billede neoman Novice
20. april 2007 - 19:24 #7
Tak for hjælpen - prøver det i løbet af weekenden, lige nu har jeg lidt andre ting at slås med :-(

Læg venligst et svar - jeg vil acceptere det når jeg samtidigt kan yde noget feedback (positiv/negativ) senest søndag :)
Avatar billede neoman Novice
22. april 2007 - 21:09 #8
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:)
Avatar billede burningice Nybegynder
23. april 2007 - 00:31 #9
oki doki...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester