Click sur un noeud d'un treview ASP net 2.0

Résolu
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005 - 19 août 2004 à 23:53
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 26 août 2004 à 00:56
Bonjour à tous

Puis - je avoir un fragment de code (ou une idée!!!) pour simuler un clik sur un arbre net 2.0?
Merci d'avance

Net_Amateur

52 réponses

cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
21 août 2004 à 16:13
Bon week end à toi aussi!! Je crois que t'es parti pour la bonne solution.
Grand merci!
Net_Amateur
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
21 août 2004 à 18:13
Voici ce que j'ai pour l'instant :






Sub Select_Change(ByVal sender As Object, ByVal e As EventArgs)
'Message
Message.Text &= "You selected: " & LinksTreeView.SelectedNode.Text
End Sub

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

If Not Request.Form("__MyEventArgument") = "" Then

If CType(Request.Form("__MyEventArgument"), Boolean) Then
Message.Text &= "Page PostBack by checking the CheckBox "
Else
Message.Text &= "Page PostBack by unchecking the CheckBox "
End If
End If

End Sub

Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Script As String
Script = "

"
Script &= "" & vbNewLine
Script &= " " & vbNewLine

Script &= "" 'J'ai pas le droit d'ecrire un bug de la beta je pense

Page.RegisterStartupScript("__MyDoPostBack", Script)

End Sub






Untitled Page



bonj





























il me reste plus qu'a mettre, dans le script javascript, tout les treenodes avec un checkbox, donc j'en ai plus pour longtemp.

Par contre j'aurais besoin de savoir un petit truc : le script ne gere plus LinksTreeView.SelectedNode (je pense avoir compris mais tres compliqué) donc tu n'auras pas accés à Cheked etc... par contre je peux rajouter une propriété,en théorie pour l'instant tu as accés à e de

Sub Select_Change(ByVal sender As Object, ByVal e As EventArgs)
'Message
Message.Text &= "You selected: " & LinksTreeView.SelectedNode.Text
End Sub

grace à Request.Form("__EVENTARGUMENT") mais je peux faire autre chose, et meme rajouter des champs caché si tu en as envie, je recherche pour essayé d'avoir un treenode mais c'est compliqué

au fait tu comprend tout ce que je fais ou pas ? lol

@+

Cyril
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
21 août 2004 à 21:06
<%@ Page Language="VB" %>
<script runat="server">

    Sub Select_Change(ByVal sender As Object, ByVal e As EventArgs)
        'Message 
        Message.Text = "You selected: " & LinksTreeView.SelectedNode.Text
    End Sub
   
    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        
        If Not Request.Form("__MyEventArgument") = "" Then
            Try
                Dim Tn As WebControl = CType(sender, WebControl)
            Catch ex As Exception
                Message.Text = "Ca a pas marché 
"
            End Try
            
            If CType(Request.Form("__MyEventArgument"), Boolean) Then
                Message.Text &= "Page PostBack by checking the CheckBox"
            Else
                Message.Text &= "Page PostBack by unchecking the CheckBox"
            End If
            
        End If

    End Sub
    
    Private Function WriteScript(ByVal NodeColl As TreeNodeCollection, ByRef i As Integer) As String
        If NodeColl.Count = 0 Then i += 1 : Return "" : Exit Function
        Dim _WriteScript As String = ""
 
        For Each Node As TreeNode In NodeColl

            If Node.ShowCheckBox Then
                _WriteScript &= "     theForm.LinksTreeViewn" & i & "CheckBox.setAttribute(""onClick"","
                _WriteScript &= """__MydoPostBack("
                _WriteScript &= "'" & "LinksTreeViewn" & i & "CheckBox" & "'"
                _WriteScript &= ","
                _WriteScript &= "'" & Node.ValuePath & "'"
                _WriteScript &= ","
                _WriteScript &= "theForm." & "LinksTreeViewn" & i & "CheckBox" & ".checked"
                _WriteScript &= " );"");" & vbNewLine
            End If
            i += 1

            If Not Node.ChildNodes.Count = 0 Then _WriteScript &= WriteScript(Node.ChildNodes, i)

        Next
        Return _WriteScript
    End Function
    
    Sub LinksTreeView_Load(ByVal sender As Object, ByVal e As System.EventArgs)

        Dim Script As String
        Script = "
" & vbNewLine
        Script &= "     " & vbNewLine
        Script &= "
" & vbNewLine
        Script &= vbNewLine
        Script &= "<" & "script language=""javascript"" type=""text/javascript"">" & vbNewLine
        Script &= " <!--" & vbNewLine
        Script &= vbNewLine        Script &"     var theForm document.forms['Form1'];" & vbNewLine
        Script &= vbNewLine
        Script &= "     function __MydoPostBack(eventTarget, eventArgument, MyEventArgument)" & vbNewLine
        Script &= "     {" & vbNewLine        Script &"         if (theForm.onsubmit null || theForm.onsubmit())" & vbNewLine
        Script &= "         {" & vbNewLine        Script &"             theForm.__EVENTTARGET.value eventTarget;" & vbNewLine        Script &"             theForm.__EVENTARGUMENT.value eventArgument;" & vbNewLine        Script &"             theForm.__MyEventArgument.value MyEventArgument;" & vbNewLine
        Script &= "             theForm.submit();" & vbNewLine
        Script &= "         }" & vbNewLine
        Script &= "     }" & vbNewLine
        Script &= vbNewLine
        
        Script &= WriteScript(LinksTreeView.Nodes,0)

        Script &= " // -->" & vbNewLine
        Script &= "</" & "script>" 'J'ai pas le droit d'ecrire </ script> un bug de la beta je pense
         
        Page.RegisterStartupScript("__MyDoPostBack", Script)
 
    End Sub
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>

    <form id="Form1" runat="Server">
        
            <Nodes>
                
                    
                        
                            
                            
                            
                        
                        
                            
                            
                            
                            
                        
                    
                    
                        
                            
                            
                        
                    
                
            </Nodes>
        
        

        

         

    </form>

</html>


Le code fonctionne, je vais faire un code un peu plus clean et j'espere que tu va bien t'amuser :)

@+
Cyril
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
21 août 2004 à 22:11
Final Version :





Sub Select_Change(ByVal sender As Object, ByVal e As EventArgs)
'Message
Message.Text = "You selected: " & LinksTreeView.SelectedNode.Text
End Sub

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

If Request.Form("__EVENTTARGET") = LinksTreeView.ClientID & "Checked" Then

Dim TheNode As TreeNode = TreeNodeJustChecked(LinksTreeView.Nodes, Request.Form("__EVENTARGUMENT"))
Message.Text &= "
" & TheNode.Checked
Message.Text &= "
" & TheNode.Text

If TheNode.Checked Then
Message.Text = "Page PostBack by checking " & TheNode.Text
Else
Message.Text = "Page PostBack by unchecking " & TheNode.Text
End If

End If

End Sub

Sub LinksTreeView_Load(ByVal sender As Object, ByVal e As System.EventArgs)

If LinksTreeView.Visible Then

Dim Script As String
Script = "" & vbNewLine
Script &= " " & vbNewLine
Script &= ""

Page.RegisterRequiresPostBack(LinksTreeView)
ClientScript.RegisterStartupScript(LinksTreeView.GetType, "__MyDoPostBack", Script)
End If

End Sub

Private Function TreeNodeJustChecked(ByVal NodeColl As TreeNodeCollection, ByVal NodePath As String) As TreeNode
If NodeColl.Count = 0 Then
Return Nothing
Exit Function
End If

For Each Node As TreeNode In NodeColl
If Not Node.ChildNodes.Count = 0 Then
Dim _TreeNodeJustChecked As TreeNode = TreeNodeJustChecked(Node.ChildNodes, NodePath)
If Not _TreeNodeJustChecked Is Nothing Then
Return _TreeNodeJustChecked
End If
End If
If Node.ValuePath = NodePath Then
Return Node
Exit For
End If
Next
End Function

Private Function WriteScript(ByVal NodeColl As TreeNodeCollection, ByVal IDTreeview As String) As String
Return WriteScript(NodeColl, IDTreeview, 0)
End Function

Private Function WriteScript(ByVal NodeColl As TreeNodeCollection, ByVal IDTreeview As String, ByRef i As Integer) As String
If NodeColl.Count = 0 Then i += 1 : Return "" : Exit Function
Dim _WriteScript As String = ""

For Each Node As TreeNode In NodeColl

If Node.ShowCheckBox Then
_WriteScript &= " theForm." & IDTreeview & "n" & i & "CheckBox.setAttribute(""onClick"","
_WriteScript &= """__doPostBack("
_WriteScript &= "'" & IDTreeview & "Checked'"
_WriteScript &= ","
_WriteScript &= "'" & Node.ValuePath & "'"
_WriteScript &= " );"");" & vbNewLine
End If
i += 1

If Not Node.ChildNodes.Count = 0 Then _WriteScript &= WriteScript(Node.ChildNodes, IDTreeview, i)

Next
Return _WriteScript
End Function





Untitled Page








































Le code est tout beau tout propre, j'ai supprimé ma gestion manuelle du postback :) et j'ai trouvé comment avoir accés au noeud cliqué.

Test le code: tu risques de pas en revenir ;)
Le code est pas expliqué, il est assez compliqué car il y a deux fonctions recurrentes un brin de javascript etc donc si t'es pas habitué à coder, ca risque d'etre difficile de tout comprendre, mais le principal, et ce que tu as a comprendre, se situe dans le page load le reste t'as pas a regarder ;)

@+
Cyril
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
22 août 2004 à 16:42
Je ne trouve pas des mots pour te remercier! Je vais tester tout cela!
Net_Amateur
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
22 août 2004 à 18:09
Mon Web Developer me sort le bug suivant:
" Function 'TreeNodeJustChecked' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used"!
P.S. N'aie pas crainte. Je sais apprécier et comprendre une belle solution de programmation. Et surtout ton altruisme!

Net_Amateur
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
22 août 2004 à 18:40
J'ai testé sur Netscape 7.0 et FireFox ...c'est super!!!!!!!!
Sans problème.
Je te répète: t'es un grand!!!
Net_Amateur
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 août 2004 à 20:39
lol merci :)

oui pour le problème je sais, c'est une nouveauté de Whidbey, ca m'informe que dans certains cas la fonction retournera rien (il n'y aurai pas de return something) le problème est du au fait que c'est une fonction recurrente et que si on lit la fonction comme ca, et ben pour que la fonction retourne qqchose (une valeur ou pas de valeur) il faut soit que NodeColl.Count = 0 soit que _TreeNodeJustChecked IsNot Nothing ce que se produit ssi le noeud a déja été trouvé

pour resoudre il faudrais mettre ca, il n'y a rien de bien compliqué mais un oublié :)

    Private Function TreeNodeJustChecked(ByVal NodeColl As TreeNodeCollection, ByVal NodePath As String) As TreeNode
        If NodeColl.Count = 0 Then
            Return Nothing
            Exit Function
        End If
        
        For Each Node As TreeNode In NodeColl
            If Not Node.ChildNodes.Count = 0 Then
                Dim _TreeNodeJustChecked As TreeNode = TreeNodeJustChecked(Node.ChildNodes, NodePath)
                If _TreeNodeJustChecked Isnot Nothing Then
                    Return _TreeNodeJustChecked
                    Exit For
                End If
            End If
            If Node.ValuePath = NodePath Then
                Return Node
                Exit For
            End If
        Next
        Return Nothing
    End Function


et pour que le code gére les erreurs : il faudrais faire ca :

    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        
        If Request.Form("__EVENTTARGET") = LinksTreeView.ClientID & "Checked" Then
           
            Dim TheNode As TreeNode = TreeNodeJustChecked(LinksTreeView.Nodes, Request.Form("__EVENTARGUMENT"))
            Message.Text &= "
" & TheNode.Checked
            Message.Text &= "
" & TheNode.Text
            If TheNode IsNot Nothing Then
                If TheNode.Checked Then
                    Message.Text = "Page PostBack by checking " & TheNode.Text
                Else
                    Message.Text = "Page PostBack by unchecking " & TheNode.Text
                End If
            Else
                Message.Text = "The PostBack was generated by" & Request.Form("__EVENTARGUMENT").Split( System.Convert.ToChar("/"))( Request.Form("__EVENTARGUMENT").Split( System.Convert.ToChar("/")).Length - 1)
            End If

        End If

    End Sub


Mais ca complexifie le truc un peu inutilement, la seule raison de faire ca, c'est si tu modifies le contenu de ton treeview avant la fonction que je viens de modifier, en effet si tu supprimes le noeud que tu viens de cliquer dans ton treeview il va te retourner nothing et donc il va pas aimer aller chercher les propriétés que je lui demande :)

ravi que ca te plaise, je viens de relire le code pour modifier ca, et j'ai eu un peu de mal a reprendre mes reperes, tu veux que je le commente, ou alors tu arrives à le comprendre sans commmentaire ?

Sinon heureusement que ca marche sous tout les navigateurs: je prone les standards donc je fais tout pour que ca marche sur tout les navigateurs ;)

@+

Cyril
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
22 août 2004 à 21:45
Si tu pourrais reprendre avec quelques commentaires... ca serait idéal. Ca m'aiderait et je comprendrais mieux ... cette logique!
Net_Amateur
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 août 2004 à 22:00
ok, je te fais ca ce soir, ou je ne sais qd car j'ai un pb avec le pc (le reseau)

juste une remarque : le bug que tu m'as signalé c'est pas un bug, mais c'est juste une indication, ca compile tres bien, et ca fonctionne sans problème malgrés cette erreur, c'est comme lorsque l'on declare une variable sans jamais l'utiliser etc... en tout cas j'ai découvert plein de petit truc comme ca assez sympa ;)

@+

Cyril
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
22 août 2004 à 22:31
D'accord! Ca compile! La preuve qu'il fonctionne sur Netscape! Mais je n'arrive pas le faire marcher sur IE! L'arbre s'affiche mais le postback ne fonctionne pas .. sauf SelectedNode!
Problème sur mon IE?
Net_Amateur
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 août 2004 à 23:06
Effectivement bug sur IE, j'avais pas testé sur IE, je regarde ca, mais pour l'instant je comprend pas :(
en plus le code est totalement different entre celui generé pour IE et celui pour les autres navigateurs :-/ c'est qd meme assez spécial.
Mais je pars du principe que tout problème à une solution :) donc il va y avoir une solution, j'espere que celle ci sera assez simple

Dsl je crois que le commentage va attendre la résolution de ce bug ;)

@+

Cyril
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 août 2004 à 00:36
J'y suis encore pas arrivé, c'est que j'avascript, j'ai une fonctionne qui fonctionne sur Firefox est pas sur IE et j'arrive pas à trouver d'équivalent, je vais essayer de trouver de l'aide sur javascriptfr.com

voici la fonction :

<HTML>

<FORM id="Form1" action="Default2.aspx" method="post">
  
  <script language="javascript" type="text/javascript">
  		//Fonctionne seulement sur Firefox
  		document.forms['Form1'].LinksTreeViewn13CheckBox.setAttribute("onClick","alert('bonjour');");
  		//Ne fonctionne ni sur IE ni sur Firefox alors que d'apres w3c, ca fonctionne comme ca : http://www.w3.org/TR/REC-html40/interact/scripts.html
//document.forms['Form1'].LinksTreeViewn13CheckBox.onclick = alert('bonjour');
</script>
</FORM>

</HTML>


si t'arrives à faire marcher ce code rien qu'en modifiant le javascript, on aura gagné, mais c'est encore pas le cas.
Je vais perseverer un peu

@+

Cyril
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
23 août 2004 à 01:43
T'as raison. Ca marche ds l'un et pas ds l'autre! Comme je n'ai pas de la doc sous ma main.. laissons jusqu'à demain!
Bonne nuit!
Net_Amateur
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
23 août 2004 à 01:59
Lis ca: http://inmyexperience.com/archives/000428.shtml
...
"My conclusion is that the setAttribute method is not fully supported in Internet Explorer. So, we resorted to workarounds, and found one"....

Net_Amateur
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 août 2004 à 12:15
-->http://www.javascriptfr.com/forum.v2.aspx?ID=282099&post=ok

Moi je vais manger, et refaire le code + commentaire, et regarder ton lien apres :)

@+

Cyril
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 août 2004 à 14:36
    Private Function WriteScript(ByVal NodeColl As TreeNodeCollection, ByVal IDTreeview As String, ByRef i As Integer) As String
        If NodeColl.Count = 0 Then i += 1 : Return "" : Exit Function
        Dim _WriteScript As String = ""
 
        For Each Node As TreeNode In NodeColl

            If Node.ShowCheckBox Then
                            _WriteScript &"     theForm." & IDTreeview & "n" & i & "CheckBox.onclick function(){"
                _WriteScript &= "__doPostBack("
                _WriteScript &= """" & IDTreeview & "Checked"""
                _WriteScript &= ","
                _WriteScript &= """" & Node.ValuePath & """"
                _WriteScript &= " )};" & vbNewLine

            End If
            i += 1

            If Not Node.ChildNodes.Count = 0 Then _WriteScript &= WriteScript(Node.ChildNodes, IDTreeview, i)

        Next
        Return _WriteScript
    End Function


Testé avec IE 6 SP2 - Firefox 0.9.3 - Mozilla 1.6
reste plus que le commentage :)

--> http://www.allhtml.com/forum/index.php?t=l&f=2&i=413064 ici pour le deuxieme topic qui m'a aidé

finalement le problème etait pas si compliqué que ca! j'ai lu la doc que que tu m'as passé, est effectivement, une fois de plus c'est bien IE qui nous emmerde :-p

@+

Cyril
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
23 août 2004 à 19:48
J'ai un IE 6 SP1. J'ai testé tttes les variantes qut'as proposé sur le forum de js. La seule qui marche avec cet IE:
document.forms['Form1'].LinksTreeViewn13CheckBox.onclick = function(){coucou("Cyril")};
Mais la procédure WriteScript (réecrite!) provoque trj un bug!!!
Net_Amateur
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 août 2004 à 20:12
ma fonction réecrit donne chez moi :
theForm.LinksTreeViewn0CheckBox.onclick = function(){__doPostBack("LinksTreeViewChecked","Table of Contents" )};

ce qui est la meme chose que chez toi :)

ouf pendant un moment j'ai cru qu'il y avait des difference entre SP1 et SP2 :)

tu es sur que ca marche pas avec IE6 ?
c'est quoi ta fonction qui est generé ? c'est pas la meme que la mienne ?

voici le code qui devrait en théorie donner la bonne fonction, je pense que c'est le meme que ci dessus, mais j'ai pus le modifier :)

 

    Private Function WriteScript(ByVal NodeColl As TreeNodeCollection, ByVal IDTreeview As String, ByRef i As Integer) As String
        If NodeColl.Count = 0 Then i += 1 : Return "" : Exit Function
        Dim _WriteScript As String = ""
 
        For Each Node As TreeNode In NodeColl

            If Node.ShowCheckBox Then
                            _WriteScript &"     theForm." & IDTreeview & "n" & i & "CheckBox.onclick function(){"
                _WriteScript &= "__doPostBack("
                _WriteScript &= """" & IDTreeview & "Checked"""
                _WriteScript &= ","
                _WriteScript &= """" & Node.ValuePath & """"
                _WriteScript &= " )};" & vbNewLine

            End If
            i += 1

            If Not Node.ChildNodes.Count = 0 Then _WriteScript &= WriteScript(Node.ChildNodes, IDTreeview, i)

        Next
        Return _WriteScript
    End Function



si ca marche chez moi et pas chez toi c'est qu'il y a un problème.

Encore une petite chose, mais je pense pas que ca vienne d'ici, le dernier code de la page que je t'ai passé a une balise tu peux supprimer l'attribut onload, je l'avais mis la car j'avais une fonction javascript qui s'appellait function page_load(){}

J'espere que ca va marcher, donne moi le code javascript qui est generé si ca marche pas

pour les comments, j'ai pas eu le temps cet apres midi, donc ce soir peut etre :)

@+

Cyril
0
cs_Dorutu Messages postés 39 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 11 mars 2005
23 août 2004 à 22:31
Bon! Voilà!
Click sur case à cocher ne donne rien. Pas d'erreur, pas d'affichage!
Sur collapse (click sur -) il y a le message suivant:

'ChildNodes[...].getElementsByTagName(...).0.childNodes' a la valeur Null ou n'est pas objet!

Net_Amateur
0
Rejoignez-nous