[ASP.NET]on_click event dynamisch te veranderen?

Pagina: 1
Acties:

  • Folkert
  • Registratie: September 2001
  • Laatst online: 10-07 07:58
Ik wil in een formulier een dropdownlist maken met daarin een optie 'anders'. Indien deze wordt gekozen wordt een extra textbox zichtbaar waarin een extra optie kan worden toegevoegd.

Ik test het volgende idee uit maar daar loop ik tegen een probleem op. Zoals je ziet wil ik het on_click event laten veranderen indien de 2e editbox wordt gekozen. De reden hiervoor is dat de waarde uiteindelijk wordt weggeschreven in een database en er misschien 2 inserts moeten worden geschreven aangezien er in .NET geen 2 formelementen met dezelfde code mag worden gebruikt. Kan iemand mij een tip geven om dit op te lossen?

Situatieschets in code
ASP.NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<%@ Page Language="VB" %>
<script runat="server">
    Sub DropDown1_SelectedIndexChanged(sender As Object, e As EventArgs)
        if DropDown1.SelectedItem.Text = "zichtbaar" then
            TextBox1.Visible = true
            Button1.onclick="Button1_Click"
        else
            TextBox1.Visible = false
            Button1.onclick="Button2_Click"
        end if
    End Sub
    
    Sub Button1_Click(sender As Object, e As EventArgs)
        label1.visible = true
        label2.visible = false
    End Sub
    
    Sub Button2_Click(sender As Object, e As EventArgs)
        label1.visible = false
        label2.visible = true
    End Sub

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <p>
            <asp:DropDownList id="DropDown1" runat="server" 
               AutoPostBack="True" selectedIndexChanged="DropDown1_SelectedIndexChanged">
                <asp:ListItem Value="Item 1">Item 1</asp:ListItem>
                <asp:ListItem Value="Item 2">Item 2</asp:ListItem>
                <asp:ListItem Value="Item 3">Item 3</asp:ListItem>
                <asp:ListItem Value="Item 4">Item 4</asp:ListItem>
                <asp:ListItem Value="Item 5">Item 5</asp:ListItem>
                <asp:ListItem Value="Item 6">zichtbaar</asp:ListItem>
            </asp:DropDownList>
            <asp:TextBox id="TextBox1" runat="server" Visible="False"></asp:TextBox>
        </p>
        <p>
            <asp:Button id="Button1" onclick="Button1_Click" runat="server" Text="Button"></asp:Button>
        </p>
        <p>
            <asp:Label id="Label1" runat="server" 
visible="False" font-bold="True" forecolor="Red">Submit actie 1
</asp:Label>
        </p>
        <p>
            <asp:Label id="Label2" runat="server" 
visible="False" font-bold="True" forecolor="Blue">Submit actie 2
</asp:Label>
        </p>
      </form>
</body>
</html>


Ik kan natuurlijk de insert dynamisch oproepen indien de 2e textbox zichtbaar is maar ik ben ook benieuwd of dit uberhaupt mogelijk is of dat er mogelijkheden zijn om dat anders op te lossen... _/-\o_

[ Voor 37% gewijzigd door Folkert op 25-08-2003 10:39 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
1
2
3
4
5
6
7
Private Sub .......
        Addhandler button1.Click, Addressof NaamVanEenSub
End Sub

Private Sub NaamVanEenSub(sender as Object, E as EventArgs)

End Sub

Kan je handlers toevoegen.

[ Voor 191% gewijzigd door gorgi_19 op 25-08-2003 10:45 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Folkert
  • Registratie: September 2001
  • Laatst online: 10-07 07:58
Had net even geprobeerd met de commandArgument maar volgens mij is deze parameter 'readOnly' en niet dynamisch te bepalen...
Ik ga nu kijken naar de AddHandler. Lees hier overigens:

'Omdat VB.NET de add/remove accessor niet ondersteunt, kunnen de geptimaliseerde event-handlers niet in VB.NET worden gebruikt'.

Maar dit betreft .NET 1.0, misschien werkt het wel in 1.1
Ik ga kijken hoe en wat... thanx alvast voor response!

[ Voor 16% gewijzigd door Folkert op 25-08-2003 10:58 ]


  • Folkert
  • Registratie: September 2001
  • Laatst online: 10-07 07:58
Ok, ik heb nu gebruik gemaakt van de AddHandler en het werkt iig zoals het moet doen. Toch gebeurt er iets raars en ik hoop dat jullie de fout ontdekken..

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub DropDown1_SelectedIndexChanged(sender As Object, e As EventArgs)
        if DropDown1.SelectedItem.Text = "zichtbaar" then
            TextBox1.Visible = true
            label3.Text = "Label1"
            AddHandler Button1.Click, AddressOf Button1_Click
        else
            TextBox1.Visible = false
            label3.Text = "Label2"
            AddHandler Button1.Click, AddressOf Button2_Click
        end if
    End Sub

    Sub Button1_Click(sender As Object, e As EventArgs)
        label1.visible = true
        label2.visible = false
        label3.Text = "test 1"
    End Sub

    Sub Button2_Click(sender As Object, e As EventArgs)
        label1.visible = false
        label2.visible = true
        label3.Text = "test 2"
    End Sub

    Sub TextBox1_TextChanged(sender As Object, e As EventArgs)
        AddHandler Button1.Click, AddressOf Button2_Click
    End Sub

    Sub Page_Load
        AddHandler Button1.Click, AddressOf Button1_Click
    End Sub


Het probleem is dat ik mijn Addhandler zoals je in de code ziet tweemaal aanroep. Allereerst in de 'SelectedIndexChanged' en ook nog een keer in de PageLoad/TextChanged. In het 2e geval werkt het wel maar in het eerste geval, dus in de dropdownlist krijg ik de Addhandler niet aan de praat.
Maw. als ik een AddHandler aanroep vanuit de textChanged werkt het prima maar als ik deze aanroep vanuit 'SelectedIndexChanged' dan gebeurt er niks.... :?

De AddHandler werkt overigens gewoon in VB.NET

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

'k heb nog eens gekeken, en je kan het veel eenvoudiger oplossen dan met die handlers..

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Imports System.Web.UI.WebControls
Imports System.Web.UI
Public Class Class1
    Inherits page

    Protected Overrides Sub CreateChildControls()

        Dim __button1 As Button = New Button
        Dim __button2 As Button = New Button

        __button1.CommandName = "Button1"
        __button2.CommandName = "Button2"

        __button1.Text = "Knop 1"
        __button2.Text = "Knop 2"

        __button1.CssClass = "ButtonStyle"
        __button2.CssClass = "ButtonStyle"

        AddHandler __button1.Click, AddressOf HandleClick
        AddHandler __button2.Click, AddressOf HandleClick

        Me.Controls.Add(__button1)
        Me.Controls.Add(__button2)

    End Sub

    Private Sub HandleClick(ByVal sender As Object, ByVal e As EventArgs)

        Dim __button As Button = CType(sender, Button)
        If __button.CommandName = "Button1" Then

            Me.HandleAction1()

        ElseIf __button.CommandName = "Button2" Then

            Me.HandleAction2()

        Else

            Throw New Exception("Class1::HandleClick::No defined commandname: " & __button.CommandName)


        End If

    End Sub

    Private Sub HandleAction1()

        ' Voer hier iets uit van Actie 1

    End Sub

    Private Sub HandleAction2()

        ' Voer hier iets uit van Actie 2

    End Sub


End Class

Moet eea wel verklaren.

[ Voor 12% gewijzigd door gorgi_19 op 25-08-2003 12:09 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Folkert
  • Registratie: September 2001
  • Laatst online: 10-07 07:58
Ok, dus toch met de Commands(Name/Arguments)... zoals in je eerste(gewijzigde) post... ;)
Ziet er ook zeker strak uit.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Folkert schreef op 25 August 2003 @ 12:10:
Ok, dus toch met de Commands(Name/Arguments)... zoals in je eerste(gewijzigde) post... ;)
Ziet er ook zeker strak uit.
ASP.Net is niet zo heel erg dol op dynamische controls.. :) Zeker als je ook met handlers enzo gaat werken.. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
:?
Ik zie niets over commandArguments hoor...

Het enige wat je doet in je eventhandler is kijken welke control die event getriggered heeft. Dit doe je door sender te casten naar een Button (als het mogelijk is), en de Name te checken.

https://fgheysels.github.io/


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

gorgi_19 schreef op 25 augustus 2003 @ 12:13:
[...]

ASP.Net is niet zo heel erg dol op dynamische controls.. :) Zeker als je ook met handlers enzo gaat werken.. :)
en als ik het goed begrijp krijg je hier dus ook elke keer een postback naar de server bij een wijziging(?) Persoonlijk zou ik gewoon een stukje javascript invoegen in het document...

Intentionally left blank


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 25 augustus 2003 @ 12:15:
:?
Ik zie niets over commandArguments hoor...

Het enige wat je doet in je eventhandler is kijken welke control die event getriggered heeft. Dit doe je door sender te casten naar een Button (als het mogelijk is), en de Name te checken.
Eventueel kan je vooraf voor de zekerheid nog het type checken, maar ik denk dat het voor deze applicatie overbodig is. :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

crisp schreef op 25 augustus 2003 @ 12:15:
[...]

en als ik het goed begrijp krijg je hier dus ook elke keer een postback naar de server bij een wijziging(?) Persoonlijk zou ik gewoon een stukje javascript invoegen in het document...
In principe krijg je voor iedere 'actie' een serverside actie (en dus een postback) ja.
Sterker nog, ASP.Net is dol op postbacks (arme 56k modemers.. :) Het enige wat die wel nog kan clientside controleren, zijn de validators. Waarbij Microsoft zo aardig is geweest om de standaard validators alleen voor IE geschikt te maken. Ergens op MSDN zitten wel DOMvalidators, die ook werken op andere browsers dan IE.

Javascript is ook een mogelijkheid (waarbij ik geen idee heb hoe die Javascript er uit zal zijn; het toevoegen aan de vb.net code is echter geen probleem.. :P)

Enige waarbij je rekening moet houden is dat ASP.Net de name en ID van een control bepaald (ook de clientstide ID / name)

[ Voor 21% gewijzigd door gorgi_19 op 25-08-2003 12:21 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
gorgi_19 schreef op 25 August 2003 @ 12:16:
[...]

Eventueel kan je vooraf voor de zekerheid nog het type checken
Defensief programmeren heet dat. :P
In jouw illustratie is dat idd niet nodig, maar in 'real' stuff zou ik het toch wel doen.

https://fgheysels.github.io/


  • Folkert
  • Registratie: September 2001
  • Laatst online: 10-07 07:58
Nee, is (nog) niet nodig. Ik heb iig nu wel een duidelijk beeld van de mogelijkheden en de oplossing. Weet iemand nog hoe het kan dat de eventhandlers niet werken bij de DropDownlist (SelectedIndexChanged) maar wel bij de TextBox (onTextchanged). Dit zijn in principe toch dezelfde triggers??????

De postback is in mijn geval geen probleem omdat het toch wordt gevolgd door een insert in de database dus er komt hoe dan ook een postback.....

[ Voor 20% gewijzigd door Folkert op 25-08-2003 12:23 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
crisp schreef op 25 August 2003 @ 12:15:
[...]

en als ik het goed begrijp krijg je hier dus ook elke keer een postback naar de server bij een wijziging(?) Persoonlijk zou ik gewoon een stukje javascript invoegen in het document...
Niet noodzakelijk.
Je hebt een aantal soorten events:
- validatie-events
- cached events (OnChange, ....)
- postback events

Het is enkel een postback event die ook een roundtrip genereert. Dan pas worden de 'cached' events ook uitgevoerd.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Folkert schreef op 25 August 2003 @ 12:21:
Nee, is (nog) niet nodig. Ik heb iig nu wel een duidelijk beeld van de mogelijkheden en de oplossing. Weet iemand nog hoe het kan dat de eventhandlers niet werken bij de DropDownlist (SelectedIndexChanged) maar wel bij de TextBox (onTextchanged). Dit zijn in principe toch dezelfde triggers??????
Mogen we dat nu zonder code gaan raden?

Zo ja: Autopostback op true zetten van je DropDownlist control.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 25 August 2003 @ 12:22:
[...]


Niet noodzakelijk.
Je hebt een aantal soorten events:
- validatie-events
- cached events (OnChange, ....)
- postback events

Het is enkel een postback event die ook een roundtrip genereert. Dan pas worden de 'cached' events ook uitgevoerd.
Niet helemaal waar, imho... Microsoft heeft, zoals ik al eerder aangaf, een steekje laten liggen bij de validators. Op IE genereert deze netjes een clientside validatie. Echter, op andere browsers wordt ook hier een postback / roundtrip naar de server gegenereerd.

Ook OnChange genereert, afaik, een roundtrip naar de server.

[ Voor 5% gewijzigd door gorgi_19 op 25-08-2003 12:24 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Folkert
  • Registratie: September 2001
  • Laatst online: 10-07 07:58
gorgi_19, nee, die staat natuurlijk al op autopostback.... :)
Deze code werkt niet:
Visual Basic .NET:
1
2
3
4
5
6
7
Sub DropDown1_SelectedIndexChanged(sender As Object, e As EventArgs)
        if DropDown1.SelectedItem.Text = "zichtbaar" then
            AddHandler Button1.Click, AddressOf Button1_Click
        else
            AddHandler Button1.Click, AddressOf Button2_Click
        end if
End Sub


Maar deze code werkt wel:
Visual Basic .NET:
1
2
3
Sub TextBox1_TextChanged(sender As Object, e As EventArgs)
        AddHandler Button1.Click, AddressOf Button2_Click
End Sub

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Dat wordt debuggen....

Hint:
Visual Basic .NET:
1
Trace.Warn("ControleWaarde",DropDown1.SelectedItem.Text)

[ Voor 19% gewijzigd door gorgi_19 op 25-08-2003 12:29 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
gorgi_19 schreef op 25 August 2003 @ 12:23:
[...]


Ook OnChange genereert, afaik, een roundtrip naar de server.
Ik kan het hier nu niet uittesten, maar ik dacht het niet.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 25 augustus 2003 @ 12:30:
[...]


Ik kan het hier nu niet uittesten, maar ik dacht het niet.
Wat is anders het nut van

Visual Basic .NET:
1
2
3
Dim __datagrid As DataGrid = New DataGrid
__datagrid.AutoPostback = true
AddHandler __datagrid.SelectedIndexChanged, AddressOf Me.HandleDatagrid

?

Als je de pure clientside oplossing kiest,
Visual Basic .NET:
1
2
Dim __datagrid As DataGrid = New DataGrid
__datagrid.Attributes.Add("onChange","Javascriptcode")


heb je idd gelijk. :)

Of bedoel je dat je gewoon een datagrid kan wijzigen, zonder dat er een postback gebeurd? Dat kan idd, maar dan krijg je hetzelfde als het wijzigen van een waarde van een textbox zonder postback.

* gorgi_19 krijgt het idee dat whoami en ik hetzelfde bedoelen, anders zeggen en langs elkaar heen praten.. :P

[ Voor 29% gewijzigd door gorgi_19 op 25-08-2003 12:35 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

gorgi_19 schreef op 25 August 2003 @ 12:19:
[...]
Enige waarbij je rekening moet houden is dat ASP.Net de name en ID van een control bepaald (ook de clientstide ID / name)
Ik kan me niet voorstellen dat je in ASP.Net zelf geen ID of name aan een element kan toekennen?

Intentionally left blank


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

crisp schreef op 25 August 2003 @ 12:43:
[...]

Ik kan me niet voorstellen dat je in ASP.Net zelf geen ID of name aan een element kan toekennen?
Bingo... :)

HTML:
1
<input name="Login1:Password" type="password" id="Login1_Password" />

Ik heb hem zelf password genoemd. Dat login1 gedeelte heeft ASP.Net zelf bedacht.. :)

Je kan het wel oplossen via een omweg, daar niet van, maar dat moet je maar even weten.... (ClientID property opvragen van een control)

[ Voor 50% gewijzigd door gorgi_19 op 25-08-2003 12:45 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1