none
comment generer dynamiquement un DetailsView en vb RRS feed

  • Question

  •  je ne connait pas par avance la table que je veux lire (dynamiquement !)

    Voici ce que ma page web doit faire :

    • 1)       je cherche une instance sql server sur le reseau
    • 2)       je m'y connecte et recupere toutes les tables utilisateurs
    • 3)       je selectionne une table et affiche les enregistrement dans un nouveau
                 datagrid
    • 4)       je selectionne un enregistrement (une ligne du datagrid) pour l'afficher
                dans un detailsview

    jusque l'a j'y arrive (tout en code behind VB)

    dans le detailsview je clique sur "edit" je passe en mode "edition"
    je clique sur "update" j'ai un message d'erreur sur l'index

    voici un lien ou j'explique plus en detail mes problemes
    http://www.aspfr.com/infomsg_DETAILSVIEW-ENTIEREMENT-DYNAMIQUE-CODE-BEHIND-ASP-NET-VB_782165.aspx

    ceci dit ma demande est simple !!!

    • creer via programmation un detailview avec modif/suppr/ajout
    • rien ne doit apparaitre dans le aspx (le sqlDataSource par exemple ne contient qu'un nom id).
    • tout doit se creer dans le code behind.

    je rappelle que les colonnes de la table ne seront connues que par programmation

    //SelectStatement = "SELECT COLUMN_NAME, data_type FROM
    INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='" & Session("fic") & "'"//

    ensuite j'essaye de creer en dynamique les valeurs que j'ai vu dans les exemples en "declaratif" en recréant tous les paramettres par exemple :

    Details_View.Fields.Clear()
    ForEach Row In fichierDS.Tables(Session("fic")).Rows
          Dim bFld As BoundField = Nothing
          bFld = New BoundField()
          bFld.DataField = Row.Item(0)
          bFld.HeaderText = Row.Item(0)
          If bFld.DataField = "id"Then
          bFld.ReadOnly = "True"
          EndIf
    Details_View.Fields.Add(bFld)
    ect...

    Le probleme et la solution (merci Cyril) est qu'en fait je dois tout générer au moment du "page init"

    donc chaque fois que je relance ma page (une fois pour choisir le serveur, une fois pour choisir la base utilisateur, une fois pour choisir la table a afficher, une fois pour recuperer les elements de la ligne choisie pour l'edition).

    quand je recupere les elements de la ligne a afficher dans le detailview, celui ci se rempli bien

    je sauvegarde dans des variables session tous les elements dont j'aurais besoin pour reconstruire le detail view lors du chargement de ma page pour valider la modification.

    Voici un exemple de ma  Page_Init

    ......

                    If Session("nbre_champs") = 0 Then ' (combien de champs pour mes futurs controlParameter)
                        j = 0
                    Else
                        j = Session("nbre_champs")
                    End If

                If Not Details.SelectCommand Is DBNull.Value And j <> 0 Then
                    Dim Details As SqlDataSource '

                    Details = New SqlDataSource(Session("detail_CS"), Session("Select_Command"))

                    Details.ConnectionString = Session("detail_CS")    '----------------chaine de connection
                    Details.SelectCommand = Session("Select_Command")
                    Details.InsertCommand = Session("Insert_Command")
                    Details.UpdateCommand = Session("Update_Command")

                    For i = 0 To j       ''essayer celui ci en rendant la session nomvar not to string dans lire colonne
                        Dim nomvar As New ControlParameter()
                        nomvar.Name = Session("detailInsertParamNom_"(i))
                        nomvar.Type = Session("detailInsertParamType_"(i))
                        Details.SelectParameters.Add(nomvar)

                    Next
                    For i = 0 To j - 1
                        Dim nomvar As New ControlParameter()
                        nomvar.Name = Session("detailUpdateParamNom_"(i))
                        nomvar.Type = Session("detailUpdateParamType_"(i))
                        Details.UpdateParameters.Add(nomvar)
                    Next
                End If

    bien sur cela ne fonctionne pas, je n'arrive pas a implementer les controles créés dynamiquement pour les fournir a ma page aspx


    merci de me donner une piste

     

    lundi 28 août 2006 10:05

Réponses

  • j'ai trouvé la solution !

    For i = 1 To j

    Dim nomvar As New ControlParameter(Session("detailUpdateParamNom_" & i.ToString), Session("detailUpdateParamType_" & i.ToString))

    Details.UpdateParameters.Add(nomvar)

    Trace.Warn("\\\-----------Page_Init---UpdateParameters-----nomvar.Name |" & i.ToString & "--" & nomvar.Name & "|")
    Trace.Warn(
    "\\\-----------Page_Init---UpdateParameters-----nomvar.Type |" & i.ToString & "--" & nomvar.ControlID & "|")

    Next


     

    vendredi 29 septembre 2006 14:11

Toutes les réponses

  • heu... dites moi..

    il n'y a pas de solution a ce probleme ?

    personne chez Microsoft ne connait la solution ?
    si c'est le cas, je trouve ceci un peu dérangeant pour une technologie system + web :(

    jeudi 21 septembre 2006 09:03
  • Bonjour,

    Je ne suis pas sur de bien comprendre votre problème ...

    Lors de la construction dynamique de contrôle, ceux-ci doivent être reconstruit à chaque "PostBack" de la page afin que les valeurs contenues dans le ViewState puissent être réaffectées.

    Pour le code que vous donnez en exemple, une chose me semble étonnante :

     If Not Details.SelectCommand Is DBNull.Value And j <> 0 Then
                    Dim Details As SqlDataSource '

    Vous testez la valeur de la propriété "SelectCommand" sur l'objet détail puis vous faites à nouveau la déclaration d'un SqlDataSource nommé de la même manière ! Il doit y avoir une erreur de compilation normalement puisque vous avez deux fouis la variable "Details" dans un même scope.

    Pour plus de clarté, quel est le message d'erreur que vous rencontrez svp ?

    jeudi 21 septembre 2006 09:44
  • merci pour l'interet que vous portez a mon probleme

    pour votre reponse, je n'ai pas d'erreur a ce niveau precis

    juste l'erreur signalée dans mon message.

    en fait je sauvegarde dans des variables sessions mes declarations

    mais je n'arrive pas a les recuperer ou plus exactement à les reaffecter parceque le system les considere comme des valeurs string

    je pourrais vous donner le fichier source

    lundi 25 septembre 2006 11:01
  • Si votre problème vient du type des objets retournés par la Session, en l'occurence "String", il est nécessaire d'effectuer un cast sur l'objet retourné. En effet l'objet Session ne retourne et ne stocke que des objets boxés vers le type "Object".

    Pour exemple :

    If CType(Session("nbre_champs"), Int32) = 0 Then ' (combien de champs pour mes futurs controlParameter)
            j = 0
    Else
            j = CType(Session("nbre_champs"), Int32)
    End If

    ...

    For i = 0 To j  ''Cette fois j est bien du type Int32

    ...

    lundi 25 septembre 2006 11:38
  • merci pour cette partie

    j'avais trouvé une autre formule

            If Session("nbre_champs") <> Nothing Then
                Dim variabletype As String = Session("nbre_champs").GetType.ToString

                If variabletype = "System.Int32" Then
                    If Session("nbre_champs") = 0 Then
                        j = 0
                    Else
                        j = Session("nbre_champs")
                    End If
                Else
                    'Session("nbre_champs") est encore de type string
                End If


                If Not Details.SelectCommand Is DBNull.Value And j <> 0 Then
                    'Dim Details As SqlDataSource 'ajout retour vacances

                    'Details = New SqlDataSource(Session("detail_CS"), Session("Select_Command"))

                    'Details.ConnectionString = Session("detail_CS")
                    'Details.SelectCommand = Session("Select_Command")
                    'Details.InsertCommand = Session("Insert_Command")
                    'Details.UpdateCommand = Session("Update_Command") '------------jusque la tout fonctionne....

                    'For i = 0 To j       ''essayer celui ci en rendant la session nomvar not to string dans lire colonne
                    '    Dim nomvar As New ControlParameter()
                    '    nomvar.Name = Session("detailInsertParamNom_" & (i)) '-------------------la ca plante car detailInsertParamNom_1 est du string
                    '    nomvar.Type = Session("detailInsertParamType_" & (i))   '------------------- et je ne sais pas le "convertir" au format nomvar.Name
                    '    Details.SelectParameters.Add(nomvar)

                    'Next
                    'For i = 0 To j - 1
                    '    Dim nomvar As New ControlParameter()
                    '    nomvar.Name = Session("detailUpdateParamNom_" & (i))
                    '    nomvar.Type = Session("detailUpdateParamType_" & (i))
                    '    Details.UpdateParameters.Add(nomvar)
                    'Next
                End If

     

    comment ais-je créé ces variables session ? grace a des tables maTableNom(i) et maTableType(i)

                    Details_View.Fields.Clear()
                    For Each Row In fichierDS.Tables(Session("fic")).Rows
                        Dim bFld As BoundField = Nothing
                        bFld = New BoundField()
                        bFld.DataField = Row.Item(0)
                        bFld.HeaderText = Row.Item(0)
                        If bFld.DataField = "id" Then
                            bFld.ReadOnly = "True"
                        End If

                        Details_View.Fields.Add(bFld)

                        'LblErreur.Text &= i & " : " & Row.Item(0) & "  |  " & Row.Item(1) & "  /  "
                        maTableNom(i) = Row.Item(0)
                        maTableType(i) = Row.Item(1)

                        'LblErreur.Text &= maTableNom(i) & " <br /> "

                        i = i + 1
                    Next

            End If

     

    puis je cree les commandes comme celle ci par exemple

                   ' generation de l'InsertCommand
                    Details.InsertCommand = "INSERT INTO " & Session("fic") & " ("
                    '
                    'dans l'insert comme dans l'update, on saute le champs "id" car c'est l'index de la table
                    'c'est pour cela que for i = 1 et non pas for i = 0 to j
                    For i = 1 To j - 1
                        Details.InsertCommand &= maTableNom(i) & ", "
                        'Session("detailInsert") &= maTableNom(i) & ", "
                    Next
                    Details.InsertCommand &= maTableNom(j) & ") "
                    'Session("detailInsert") &= maTableNom(j) & ") "
                    Details.InsertCommand &= "VALUES ("
                    'Session("detailInsert") &= "VALUES ("
                    For i = 1 To j - 1
                        Details.InsertCommand &= "@" & maTableNom(i) & ", "
                        'Session("detailInsert") &= "@" & maTableNom(i) & ", "
                    Next
                    Details.InsertCommand &= "@" & maTableNom(j) & ") "
                    'Session("detailInsert") &= "@" & maTableNom(j) & ") "

     

                    ' generation des Insert/UpdateParameters
                    '
                    'uptdate sans le champs index (donc table a partir de 1)
                    'Details.UpdateParameters.Add("dodo", TypeCode.String, "@" & maTableNom(j))
                    'voir ici http://msdn2.microsoft.com/fr-fr/library/system.web.ui.webcontrols.querystringparameter.aspx
                    'en fait actuellement je ne rempli par le type code mais la "valeur" !!!
                    'il faudrais que je recupere la valeur de maTableType
                    'et que je fasse un case changeant le TypeCode.quelquechose en TypeCode.la valeur (corrigee) de maTableType(i)
                    'corrigee signifiant que le type nvarchar devienne TypeCode.String par exemple
                    'pour le reste, la variable session   Session("Insert_Parameters_" & i) est bien formee et contient bien les bonnes infos 
                    ' 
                    For i = 1 To j
                        Details.UpdateParameters.Add(maTableNom(i).ToString, maTableType(i).ToString)
                        Session("detailUpdateParamNom_"(i)) = maTableNom(i).ToString
                        Session("detailUpdateParamType_"(i)) = maTableType(i).ToString
                        'Details.UpdateParameters.Add("name =" & maTableNom(i).ToString, "Type=" & maTableType(i).ToString)
                    Next
                    'Insert avec le champs index (donc table a partir de 0)
                    For i = 0 To j
                        Details.InsertParameters.Add(maTableNom(i).ToString, maTableType(i).ToString)
                        Session("detailInsertParamNom_"(i)) = maTableNom(i).ToString
                        Session("detailInsertParamType_"(i)) = maTableType(i).ToString
                    Next

     

    ensuite je sauvegarde ces "commandes" dans des variables session histoire de les recuperer dans le page init

                    Session("detail_CS") = Details.ConnectionString
                    Session("Select_Command") = Details.SelectCommand
                    Session("Insert_Command") = Details.InsertCommand
                    Session("Update_Command") = Details.UpdateCommand

    j'avoue ne pas peut etre prendre le probleme par le bon coté, mais j'ai tout fait par moi meme en essayant de comprendre de maniere empirique.

    le probleme est simple mais aucun exemple dans ce sens sur le net (et encore moins dans des livres.

     

    merci pour votre lecture

    mardi 26 septembre 2006 08:39
  • La propriété "Name" de l'objet "ControlParameter" est bien du type "String".
    Je ne comprend donc pas bien d'où vient le problème ...

    Pour la propriété "Type" de l'objet "ControlParameter", il est important de retrouver le type depuis la Session et donc de modifier votre code de la manière suivante :

    nomvar.Type = Type.GetType(Session("detailInsertParamType_" & (i)))

    mardi 26 septembre 2006 11:24
  • message d'erreur

    Unable to cast object of type 'System.String' to type 'System.Type'.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Type'.

    Source Error:

    Line 56:                     Dim nomvar As New ControlParameter()
    Line 57:                     nomvar.Name = Session("detailInsertParamNom_" & (i))
    Line 58:                     nomvar.Type = Type.GetTypeCode(Session("detailInsertParamType_" & i.ToString))
    Line 59:                     Details.SelectParameters.Add(nomvar)
    

     

    mes variables contiennent le données suivantes

    \\\----------------------InsertParameters |0 - id| 0.012160484083871 0.012081
    \\\----------------------InsertParameters |1 - nom_rayon_1| 0.0122018301208673 0.000041
    \\\----------------------InsertParameters |2 - nom_rayon_2| 0.01222334123471 0.000022
    \\\----------------------InsertParameters |3 - nom_rayon_3| 0.0122437348880933 0.000020
    \\\----------------------InsertParameters |4 - position| 0.012263569811247 0.000020
    \\\----------------------InsertParameters |5 - actif| 0.012286198385549 0.000023
    \\\----------------------UpdateParameters |1 - nom_rayon_2| 0.0123074301342768 0.000021
    \\\----------------------UpdateParameters |2 - nom_rayon_3| 0.0123275444225453 0.000020
    \\\----------------------UpdateParameters |3 - position| 0.0123496142666177 0.000022
    \\\----------------------UpdateParameters |4 - actif| 0.0123702872851158 0.000021
    \\\----------------------Details.SelectCommand |SELECT * FROM T_Rayon WHERE [id] = @id|

     

    mardi 26 septembre 2006 13:02
  • Le message d'erreur stipule que vous utilisez Type.GetTypeCode et non Type.GetType
    mardi 26 septembre 2006 13:18
  • Type.GetType me donne le message d'erreur suivant dans vs en souligné sur la ligne

    nomvar.Type = Type.GetType(Session("detailUpdateParamType_" & i.ToString))
    value of Type 'System.Type' cannot be converted to 'system.Typecode'.


    j'avais auparavant
    SELECT * FROM T_Marque WHERE [id] = @id
    que j'ai changé par la variable session Sess_id
    j'ai donc bien maintenant    SELECT * FROM T_Marque WHERE [id] = 1 dans la variable session "Sess_Select_Command"

    est-ce que mon probleme pourrait venir de la perte des variables en "@"
    UPDATE T_Marque SET marque= @marque c'est a dire une perte au rechargement de la page de la valeur "@marque"
     


    voici le detail de mes variables sauvegardée pour pouvoir tout recreer dans le page-init
    ok System.Boolean False  
    drop_choix System.String telephonie                          
    grid_index System.String T_Marque
    fic System.String T_Rayon
    nbre_champs System.Int32 2  
    detailUpdateParamNom_1 System.String marque
    detailUpdateParamType_1 System.String nchar
    detailUpdateParamNom_2 System.String actif
    detailUpdateParamType_2 System.String bit
    detailUpdateParamNom_3 System.String nom_rayon_3
    detailUpdateParamType_3 System.String nchar
    detailUpdateParamNom_4 System.String position
    detailUpdateParamType_4 System.String int
    detailUpdateParamNom_5 System.String actif
    detailUpdateParamType_5 System.String bit
    detailInsertParamNom_0 System.String id
    detailInsertParamType_0 System.String int
    detailInsertParamNom_1 System.String marque
    detailInsertParamType_1 System.String nchar
    detailInsertParamNom_2 System.String actif
    detailInsertParamType_2 System.String bit
    detailInsertParamNom_3 System.String nom_rayon_3
    detailInsertParamType_3 System.String nchar
    detailInsertParamNom_4 System.String position
    detailInsertParamType_4 System.String int
    detailInsertParamNom_5 System.String actif
    detailInsertParamType_5 System.String bit
    Sess_drop_choix System.String telephonie                         
    Sess_fic System.String T_Marque
    Sess_detail_CS System.String Data Source=DEDMOBIL-3;Initial Catalog=telephonie;Integrated Security=True
    Sess_Select_Command System.String SELECT * FROM T_Marque WHERE [id] = 1
    Sess_Insert_Command System.String INSERT INTO T_Marque (marque, actif) VALUES (@marque, @actif) 
    Sess_Update_Command System.String UPDATE T_Marque SET marque= @marque, actif= @actif  @marque, @actif WHERE [id] = 1
    Sess_ok System.Boolean False
    Sess_id System.String 1
    Sess_CS System.String Data Source=DEDMOBIL-3;Initial Catalog=telephonie;Integrated Security=True


    merci pour votre aide

    mardi 26 septembre 2006 15:30
  • j'ai trouvé la solution !

    For i = 1 To j

    Dim nomvar As New ControlParameter(Session("detailUpdateParamNom_" & i.ToString), Session("detailUpdateParamType_" & i.ToString))

    Details.UpdateParameters.Add(nomvar)

    Trace.Warn("\\\-----------Page_Init---UpdateParameters-----nomvar.Name |" & i.ToString & "--" & nomvar.Name & "|")
    Trace.Warn(
    "\\\-----------Page_Init---UpdateParameters-----nomvar.Type |" & i.ToString & "--" & nomvar.ControlID & "|")

    Next


     

    vendredi 29 septembre 2006 14:11
  • malheureusement j'ai tjrs l'erreur sur l'index des que dans mon detail view j'essaye de passer en modif !
    lundi 9 octobre 2006 10:27
  • bjr:

    j'ai le même besoin qui est de changer l'affichage en mode Edit des textbox qui sont données par défaut

    Mon idée est d'afficher le détailsview qui sera rempli dynamiquement par le datasource et les champs je les enseigne par code

    ds_T_Simples.SelectCommand = "Select " & Session("IDT_Select") & " From " & Session("IDT_Table") & " " & Session("IDT_Where_Societe") & " " & Session("IDT_Where_Site") & " " & Session("IDT_Where_Depot") & " " & Session("IDT_Where")

    par exemple la session("IDT_Select") est remplie par un champs dans une table paramètre qui contien les champs à afficher sur la table.

    ID_TACHE, SITE, CANAL, INTERVENENT, DATE_TACHE, MOIS, MODULE_CONCERNE, OBJET, ANALYSE_FAITE, TYPE, DATE_REALISATION, STATUT, DATE_FERMETURE, DEMANDEUR, SERVICE_DEMANDEUR, PILOTE, SERVICE_PILOTE, RESSOURCE, SERVICE_RESSOURCE, DESTINATAIRE, MAIL_CC, ACTION_ENTRETENUE

    donc j'arrive à afficher mon détailsview

    sauf quand j'appui sur Modifier il me donne que des textbox et moi j'ai besoin de changer en date par exemple ou en textbox multiline ou autre

    Merci pour m'indiquer comment je doit faire.

    vendredi 8 décembre 2006 12:07