[C#/ASP.NET] Problem de refresh

Problem de refresh [C#/ASP.NET] - C#/.NET managed - Programmation

Marsh Posté le 10-01-2005 à 11:20:16    

Ca doit être un problème hyper récurrent, je me souviens l'avoir déjà eu.
 
J'ai un objet "TreeView" dans une page. Lorsque je clique sur une node, je voudrais connaître dans la page quel est l'ID de la node sélectionnée.
 
Rien à faire, systématiquement j'ai la node sélectionnée au coup d'avant :/
 
Ma class TreeBloc :

Code :
  1. using System;
  2. using System.Data;
  3. using System.Web;
  4. using System.Web.UI;
  5. using System.Web.UI.WebControls;
  6. using System.Web.UI.HtmlControls;
  7. using System.ComponentModel;
  8. using Microsoft.Web.UI.WebControls;
  9. using NetCms.Web.Bo.Controls;
  10. using NetCms.Web.Bo.Components;
  11. using Cms.Components.Facade;
  12. using Cms.Components.Common;
  13. namespace NetCms.Web.Bo.Controls
  14. {
  15. /// <summary>
  16. /// Description résumée de TreeBloc.
  17. /// </summary>
  18. public class TreeBloc : Bloc
  19. {
  20.  private TreeView _treeView;
  21.  /// <summary>  
  22.  /// TreeBloc : Constructeur
  23.  /// </summary>
  24.  public TreeBloc()
  25.  {
  26.   _treeView = new TreeView();
  27.   _treeView.ID = "treeview";
  28.   _treeView.Expand += new ClickEventHandler(NodeExpand);
  29.   _treeView.Collapse += new ClickEventHandler(NodeCollapse);
  30.   _treeView.SelectedIndexChange += new SelectEventHandler(OnSelectNode);
  31.   _treeView.Attributes.Add("onclick", "document.all.menuIsVisible.value='1'; document.getElementById('menuX').value = event.x; document.getElementById('menuY').value = event.y + document.body.scrollTop; document.getElementById('scroll').value = document.body.scrollTop; document.all.ctxMenuArbo.style.left = event.x; document.all.ctxMenuArbo.style.top = event.y + document.body.scrollTop; document.all.ctxMenuArbo.style.visibility='visible';" );
  32.   _treeView.SelectExpands = false;
  33.   _treeView.ShowPlus = true;
  34.   _treeView.ShowLines = false;
  35.   _treeView.AutoPostBack = true;
  36.   _treeView.CssClass = "texte-intitule";
  37.   _treeView.HoverStyle.CssText =  "font-family : arial; color:#000000; background : #C4B4E7; font-size : 8pt;  text-decoration : none;";
  38.   _treeView.ExpandedImageUrl=PageBase.ApplicationVirtualRoot + "/Medias/img/bt_dossier_ouvert.gif";
  39.   _treeView.ImageUrl=PageBase.ApplicationVirtualRoot + "/Medias/img/bt_dossier_ferme.gif";
  40.   _treeView.DefaultStyle.CssText = "font-family : arial; color:#000000; background : #ffffff; font-size : 8pt;  text-decoration : none;";
  41.   _treeView.SelectedStyle.CssText = "font-family : arial; font-weight:bold; color:#FFFFFF; background : #C4B4E7;";
  42.   _treeView.EnableViewState = true;
  43.  }
  44.  public void Initialize(ListItem rootItem)
  45.  {
  46.   TreeNode rootNode = new TreeNode();
  47.   rootNode.Text = rootItem.Text;
  48.   rootNode.NodeData = rootItem.Value;
  49.   _treeView.Nodes.Add(rootNode);
  50.   rootNode.Expanded = true;
  51.  }
  52.  public TreeNode getNode(String nodeIndex)
  53.  {
  54.             return _treeView.GetNodeFromIndex(nodeIndex);
  55.  }
  56.  public String getSelectedNodeIndex()
  57.  {
  58.   this.EnsureChildControls();
  59.   return _treeView.SelectedNodeIndex;
  60.  }
  61.  private void NodeExpand(Object sender, TreeViewClickEventArgs e)
  62.  {
  63. //   TreeNode expandedNode = _treeView.GetNodeFromIndex(e.Node);
  64.  }
  65.  public void NodeExpand(string index)
  66.  {
  67.   TreeNode expandedNode = _treeView.GetNodeFromIndex(index);
  68.   _treeView.GetNodeFromIndex(index).Expanded = true;
  69.  }
  70.  private void NodeCollapse(Object sender, TreeViewClickEventArgs e)
  71.  {
  72.  }
  73.  public void LoadData(DataTable data)
  74.  {
  75.   _treeView.Nodes.Clear();
  76.   foreach (DataRow row in data.Rows)
  77.   {
  78.    TreeNode node = new TreeNode();
  79.    node.Text = row[2].ToString();
  80.    node.ID = row[0].ToString() + "." + row[1].ToString();
  81.    addChildren(node);
  82.    _treeView.Nodes.Add(node);
  83.   }
  84.  }
  85.  private void addChildren(TreeNode node)
  86.  {
  87.   DataTable data = (new facSubTree(node.ID)).getSubTreeData();
  88.   foreach (DataRow row in data.Rows)
  89.   {
  90.    TreeNode childNode = new TreeNode();
  91.    childNode.Text = row[2].ToString();
  92.    childNode.ID = row[0].ToString() + "." + row[1].ToString();
  93.    node.Nodes.Add(childNode);
  94.    addChildren(childNode);
  95.   }
  96.  }
  97.  public void SetChildNodes(TreeNode parentNode)
  98.  {
  99. //   parentNode.Nodes.Clear();
  100.  }
  101.  public void SetExpanded(TreeNode expandedNode)
  102.  {
  103.  }
  104.  public void Refresh()
  105.  {
  106.   ((TextBox) Page.FindControl("objId" )).Text = this.getNode(this.getSelectedNodeIndex()).ID;
  107.   this.DataBind();
  108.  }
  109.  /// <summary>  
  110.  /// CreateChildControls : créé les contrôles enfants selon la propriété 'type'
  111.  /// </summary>
  112.  protected override void CreateChildControls()
  113.  {
  114.   this.Controls.Add(_treeView);
  115.  }
  116.  public void OnSelectNode(Object sender, TreeViewSelectEventArgs e)
  117.  {
  118. //   TreeNode selectedNode = _treeView.GetNodeFromIndex(e.NewNode);
  119.   Refresh();
  120.  }
  121. }
  122. }


 
Ma tentative d'appel :

Code :
  1. TreeBloc tree = new TreeBloc();
  2.   facTree treeEntries = new facTree(COD_RUB);
  3.   tree.LoadData(treeEntries.getTreeData());
  4.   tree.Title = "Liste des éléments";
  5.   tree.Visible = true;
  6.   divTree.Controls.Add(tree);
  7.   tree.Refresh();
  8.   Literal test = new Literal();
  9. //   test.Text = tree.getNode(tree.getSelectedNodeIndex()).Text;
  10.   test.Text = objId.Text;
  11.   divEdit.Controls.Add(test);


 
:sweat:

Reply

Marsh Posté le 10-01-2005 à 11:20:16   

Reply

Marsh Posté le 10-01-2005 à 11:48:28    

A noter un truc assez "fun".
 
Si je demande à afficher mon champ caché "objId" (rafraîchit par le .Refresh() de mon TreeBloc), il est à la bonne valeur.
Mais lorsque je le reli pour alimenter une variable (ici, le .Text de mon objet Literal) je récupère la valeur précédente. :sweat:
 
http://magicbuzz.multimania.com/files/treebloc.png


Message édité par Arjuna le 10-01-2005 à 11:53:48
Reply

Marsh Posté le 10-01-2005 à 15:11:00    

Là ça me gonfle sévère.
Je n'y arrive vraiment pas.
 
Y'a vraiment personne à qui s'est arrivé ? Vous m'étonnez sérieusement quand même...
 
Je viens de tenter de bourriner un coup (à défaut d'avoir un coup de pouce j'essaie n'importe quoi), et ça marche pas :
 

Code :
  1. public void OnSelectNode(Object sender, TreeViewSelectEventArgs e)
  2.  {
  3.   if (((TreeView) sender).GetNodeFromIndex(((TreeView) sender).SelectedNodeIndex).ID != Request.Form["objId"].ToString())
  4.   {
  5.                 ((TextBox) Page.FindControl("objId" )).Text = ((TreeView) sender).GetNodeFromIndex(((TreeView) sender).SelectedNodeIndex).ID;
  6. //    ((TextBox) Page.FindControl("objId" )).Text = e.NewNode;
  7.    ((Label) Page.FindControl("js" )).Text += "<script>document.Form1.submit();</script>";
  8.   }
  9.  }


 
Il part en délire total, il recharge en permanance, preuve qu'il ne prends pas en compte mon test (j'ai tout essayé dans le test, prendre le selectecIndex, la valeur du champ, la valeur récupérée en form, etc.)
 
Le but du jeu était ici de soumettre deux fois de suite lors de la sélection d'une node, histoire qu'au second refresh, dans le code je puisse lire la bonne valeur du selectedIndex. Mais non, la valeur affichée n'est visiblement pas la même qu'en interne, puisque ça refresh en boucle si jeme base sur la valeur qui est censée être dans la variable.
 
Bref. Help :sweat:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed