IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual Studio Discussion :

[ASP.NET/C#] [objet inaccessible] DetailsView dans un repeater


Sujet :

Visual Studio

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut [ASP.NET/C#] [objet inaccessible] DetailsView dans un repeater
    Bonjour !

    ça commence souvent comme ça le matin...

    J'ai une page html (asp.net) contenant de nombreux objets imbriqués (des Repeater contenant des datasources et Repeater, etc... sur trois couches !) et évidemment seuls les objets non contenu dans le premier repeater sont accessible depuis le code C#.

    J'ai un DetailsView tout au bout de ma jolie pyramide qu'il me faut passer en Insert mode s'il n'y a pas de données (et évidemment dans ce tableau il n'y a soit pas de données, soit une seule)

    N'existe-til pas un moyen d'accéder à mon objet ? (je pense que si je ne peux pas y accéder, c'est que pour le C# l'objet n'existe pas encore à cause du repeater)

    Mon code est complexe est imbitable, mais en gros (très gros) ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SqlDataSource1
    ListBox1
    Repeater1
    {
      SqlDataSource2
      DetailsView1
      SqlDataSource3
      Repeater2
      {
        SqlDataSource3
        {
          SqlDataSource4
          DetailsView2
        }
      }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Bon,

    J'ai ajouté ceci dans ma partie C# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        protected void Page_Load(object sender, EventArgs e)
        {
            SqlDataSource SqlTemp = Repeater1.FindControl("Repeater2").FindControl("Repeater3").FindControl("SqlDataSource3") as SqlDataSource;
            SqlTemp.Selected += new SqlDataSourceStatusEventHandler(SqlDataSource3_Selected);
        }
     
        protected void SqlDataSource3_Selected(object sender, SqlDataSourceStatusEventArgs e)
        {
            if (e.AffectedRows == 0)
            {
                DetailsView DetailsTemp = Repeater1.FindControl("Repeater2").FindControl("Repeater3").FindControl("DetailsView2") as DetailsView;
                DetailsTemp.ChangeMode(DetailsViewMode.Insert);
            }
        }
    mais sur SqlTemp.Selected j'ai comme erreur : La référence d'objet n'est pas définie à une instance d'un objet
    Dans la partie code en débugage, SqlTemp est null

    Si je teste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public partial class admin_Familles : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Repeater RepTemp1 = new Repeater();
            RepTemp1 = Repeater1.FindControl("Repeater2") as Repeater;
            AffichageTemp.Text = RepTemp1.ID;
        }
    }
    AffichageTemp étant un label asp en runat server, RepTemp1.ID me donne aussi : La référence d'objet n'est pas définie à une instance d'un objet

    D'accord je débute en C#, mais là je vois plus où chercher...

    Edit : Repeater1.Controls.Count me donne 0... rhâââ

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    ok, donc Repeater1.Control[0] donne accès à la balise < ItemTemplate > du repeater, donc pour accéder au premier élément il faut faire Repeater1.Control[0].Control[0], sur trois niveaux ça fait un joli truc... et au moindre changement dans la page, il faut tout changer... de plus comme ça je pointe sur tout les objets DetailsView dans chaque itération du repeater, pas très pratique si je veux en éditer qu'un seul...

    Donc j'ai dû ajouter un bouton qui me permet (en demandant le parent) de savoir quelle zone doit être mise en "insert".

    donc en fait dans le EmptyDataTemplate de mon DetailsView j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <EmptyDataTemplate>
        <asp:Button ID="Button1" runat="server" CausesValidation="True"
          Text="Créer" OnClick="DetailsView1_Click" OnLoad="DetailsView1_Load" />
    </EmptyDataTemplate>
    et dans le source (C#) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        protected void DetailsView1_Click(object sender, EventArgs e)
        {
            DetailsView DetailsTemp = (sender as Control).Parent.Parent.Parent.Parent as DetailsView;
            DetailsTemp.ChangeMode(DetailsViewMode.Insert);
        }
     
        protected void DetailsView1_Load(object sender, EventArgs e)
        {
            if (ListBox1.SelectedIndex < 0)
            {
                Button Btn = (sender as Button);
                Btn.Visible = false;
            }
        }
    Le onload me permet de ne pas afficher le bouton si rien n'a été sélectionné plus haut dans ma "pyramide".

    Bon jusque là je m'en suis sorti.

    Mon problème suivant (évidemment, avec une structure pareil, ça s'enchaine !) :
    J'ai des SqlDataSource intercalés qui me calculent le prochain identifiant pour mes insertions (et ainsi je n'ai rien à faire sur les évènements d'insertions en code ou dans la base...) mais comme mon dernier niveau et répété plusieurs fois et que cet identifiant reste le même si je fais une insertion (en gros il ne se rafraichit pas !!) si je fais une seconde insertion dans une autre itération de mon DetailsView, j'ai le même ID ! donc plantage de la requête.

    Y'a-t-il un moyen efficace de "lier" des DataSource pour les rafraichir (avec les labels, listbox, ou view dépendant) quand une autre subit des modifications ?

    Dans mon page load j'ai mis ça (ébauche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                SqlDataSource1.DataBind();
                ListBox.DataBind();
            }
        }
    Mais ça me rafraichit la listbox, qui n'a plus rien de sélectionné, résultat mes données ne s'affichent pas dans les autres objets.

    je continue mes investigations, mais un coup de pouce, une idée, ça me ferais bien accélérer ^^

    Edit : Autre problème, j'ai un listbox, un SqlDataSource lié, un repeater sur les résultats du DataSource et au final un label contenant un valeur ainsi : Text='<%# Bind("ChronoFamillePlusUn") %>'
    Bind n'est-il pas sensé se mettre à jour si je fais un Bind() sur mon objet SqlDataSource ?? sa valeur ne change pas alors qu'elle devrait... non ?

    Edit 2 : Je clôture, personne ne voit la question, j'ouvre un autre thread ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/03/2010, 23h30
  2. Réponses: 9
    Dernier message: 06/08/2007, 01h37
  3. Réponses: 1
    Dernier message: 02/08/2007, 16h17
  4. Réponses: 6
    Dernier message: 09/07/2007, 17h02
  5. [SQL 2005][ASP.net 2]Insertion de date dans une table
    Par skystef dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/12/2006, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo