Meilleur auteur de réponses
comment generer dynamiquement un DetailsView en vb

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'indexvoici un lien ou j'explique plus en detail mes problemes
http://www.aspfr.com/infomsg_DETAILSVIEW-ENTIEREMENT-DYNAMIQUE-CODE-BEHIND-ASP-NET-VB_782165.aspxceci 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 IfIf 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
bien sur cela ne fonctionne pas, je n'arrive pas a implementer les controles créés dynamiquement pour les fournir a ma page aspx
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
merci de me donner une piste
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
Toutes les réponses
-
-
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 ?
-
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
-
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
...
-
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 Ifcomment 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 IfDetails_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
NextEnd 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
Nextensuite 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.UpdateCommandj'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
-
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)))
-
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| -
-
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 -
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
-
-
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.