[Résolu][ASP.Net 2] Problème de GridView + Conseils

Hello,

J’ai un petit soucis concernant l’utilisation d’une GridView. Je m’explique, j’aimerais faire une page comme ceci :

Comme vous pouvez le voir, lorsque je cliques sur le bouton Ajouter, j’aimerais que le texte de l’élément du TreeView de droite s’ajoute dans le texte marqué « Champ choisi ».

J’ai essayé de faire ça avec une GridView mais je pense que ce n’est clairement pas le bon composant pour faire ça… mais je ne trouve pas de composant adéquat.

Autre petite question, j’utilise une base de données PostgreSQL, et j’aurais aimé savoir s’il est prudent d’utiliser le driver ODBC avec cette base de donnée ou si c’est mieux d’utiliser le driver natif npgsql… malgré le fait qu’il est plutôt prévu pour .Net 1.1 et qu’il n’existe pas de composant DataSource pour ce driver.

Enfin, j’ai trois pages où j’affiche à l’aide d’une DataList le contenu d’une table de ma base de données.

La différence entre ces trois pages est minime, j’affiche en fait le contenu de trois tables différentes. Donc ce qui change c’est grosso-modo le DataSource (et encore, juste la SelectCommand) et le ItemTemplate de ma DataList.

Pour le moment j’ai fait ceci avec trois pages aspx différentes. J’aurais aimé les mettres ensemble, mais je ne sais pas comment m’y prendre.

En espérant avoir été suffisemment clair… merci de votre aide :stuck_out_tongue:

Ben, honnêtement, non, c’est pas bien clair.
Au risque d’être taquin, ton treeview est à gauche.
Mais pourquoi tu n’utilises pas un treeview, justement? Le bouton ajouter regarderait juste le selectedNode du treeview et ajouterait ce qu’il faut?
Pour la base de données, si vraiment tu ne veux pas utiliser SQL Server Express qui est gratuit, si un driver 2.0 n’existe pas encore, ça ne devrait pas tarder. Pas besoin de datasource spécifique, la SqlDataSource marche avec n’importe quel provider OleDb.
Pour le dernier problème, il me semble qu’une master page pourrait contenir tout ce qui est commun entre les différentes pages, et les content pages changent juste ce qui leur est spécifique. On peut aussi faire ça en utilisant une Page dérivée, mais c’est un peu plus technique.

Hum, m’étonne pas :stuck_out_tongue: j’arrive à peine à comprendre ce que j’ai voulu dire :stuck_out_tongue:

[quote=« boudin, post:2, topic: 25593 »]Au risque d’être taquin, ton treeview est à gauche.
Mais pourquoi tu n’utilises pas un treeview, justement? Le bouton ajouter regarderait juste le selectedNode du treeview et ajouterait ce qu’il faut?[/quote]

Oui alors effectivement j’utilise un TreeView pour la partie gauche, pour ça j’ai pas de soucis.
En fait, c’est la partie droite qui me pause un problème. Le bouton ajouter regarde bien le selected node… mais je ne sais pas comment ajouter ce que je veux dans le contrôle de la partie droite.
C’est justement ce contrôle de la partie droite que je ne sais pas choisir.
J’avais pensé une GridView avec comme colonne une liste déroulante, un label et une editbox mais je ne sais pas comment ajouter une ligne dans cette GridView. Donc je pense que ce n’est pas le bon contrôle pour faire ça. Mais je ne sais pas lequel choisir.

[quote=« boudin, post:2, topic: 25593 »]Pour la base de données, si vraiment tu ne veux pas utiliser SQL Server Express qui est gratuit, si un driver 2.0 n’existe pas encore, ça ne devrait pas tarder. Pas besoin de datasource spécifique, la SqlDataSource
marche avec n’importe quel provider OleDb.[/quote]
Ben le fait est que j’adorerais utiliser SQL Server Express mais mes profs en ont décidés autrement pour une obscure raison… (dont le fait que SQL Server c’est pas gratuit… :stuck_out_tongue: très logique). J’ai regardé un peu le projet de Npgsql qui est le projet open source de driver natif pour PostgreSQL et ça n’a pas l’air d’être leur principale priorité de faire un driver 2.0. Donc bon en attendant je reste sur ODBC à moins que qqn n’aie une meilleure idée…

Bon en fait j’ai déjà une MasterPage qui reprend tout ce qui est menu à gauche et banière du site… Mais j’aurais aimé encore plus mettre ensemble… Genre n’avoir qu’à changer la SelectCommand de mon DataSource et le ItemTemplate de ma DataList. Ceci dynamiquement… mais je ne sais pas si c’est vraiment une bonne idée.

Sql Server Express est 100% gratuit :stuck_out_tongue:

Vu que tu trouves pas quel composant est adéquat… crée le toi même.
Un UserControl avec 2/3 WebControls classiques à l’intérieurs, les bonnes propriétés et attributs pour qu’il faut pour que le Designer puisse afficher proprement et ça roule.

Tu le colles dans la zone de droite, et par le code tu lui affectes ses propriétés que t’as créé toi même correspondant au SelectedNode.

Ca peut paraitre compliqué, mais ça l’est beaucoup moins au final que d’utiliser une usine à gaz comme le DataGridView pour aussi peu de données.

Bon, après un peu de ménage dans le thread je me permet de récrire un petit post parce que je suis toujours bloqué sur ce satané contrôle.

Alors, maintenant j’ai trouvé le moyen de faire mon contrôle presque totalement, c’est à dire que j’ai bien une DropDownList, un label, une textbox et un bouton (pour supprimer la ligne) sous la forme de liste et j’arrive à ajouter et supprimer des lignes à ce contrôle, tout ça c’est bon.

Pour faire ça j’ai suivi les conseils de ce site qui explique comment créer une ButtonList.

Bon, j’ai donc créé une « RechercheList » qui hérite de « WebControl » et qui implémente « IRepeatInfoUser » qui permet de justement créer une liste qui répète une liste de contrôles.

Dans cette « RechercheList » j’ai donc une collection appelée « RechercheListCollection » qui est en fait la liste des lignes que va contenir mon contrôle qui sont représentés par une classe « RechercheListItem » qui va contenir toutes les informations qui vont servir pour mon contrôle.

Tout ça est très bien, j’arrive sans problème à afficher mon contrôle, j’utilise le ViewState pour garder l’état du contrôle, tout ça fonctionne très bien.

Le soucis que j’ai, c’est comment faire pour que lorsque mon utilisateur va modifier la sélection de la DropDownList ou le texte d’une des TextBox pour que les modifications soient répercutées dans le « RechercheItem » correspondant?

Parce que pour l’instant si je modifie ces valeurs et que je rajoute un Item à ma liste, la valeur modifiée n’est pas gardée et revient au début.

Le code que j’ai déjà fait

J’espère vraiment que qqn de la zone pourra me filer un coup de main avec ça, parce que je commence à désespérer et c’est vraiment important… :stuck_out_tongue:

Bon, alors je suis plutôt content, j’ai réussi finalement à terminer mon contrôle et il fonctionne comme je le souhaitais.

Finalement je suis repartis sur l’idée du CustomControl et effectivement c’est plutôt chaud à implémenter, mais je suis content de l’avoir fait, j’ai appris pas mal de choses, même s’il n’est certainement pas parfait.

Je vais vous faire un petit résumé sur comment le faire, je pense que certaines personnes pourront être intéressées. Je ne vais pas mettre le code source ici, déjà parce qu’il n’est pas totalement terminé et qu’il est un peu crados mais aussi parce que c’est un peu long. Mais si vraiment je l’envoie sans problème à celui qui le désire.

Donc, passons aux choses sérieuses :
Déjà, j’ai créé un contrôle qui dérive de WebControls (normal, c’est un contrôle Web). Certains me diront que j’aurais pu le faire dériver de ListControl, comme CheckBoxList, RadioButtonList, etc. Mais ce n’était pas possible car la collection Items (qui définit l’ensemble des Items de la liste) des ListControl est forcément une ListItemCollection, ce qui ne me convenait pas car je souhaitais utiliser ma propre collection d’Items.

J’ai donc créé une RechercheListeItemCollection et une RechercheListeItem afin de gérer la collection qui va s’afficher dans mon contrôle.

Ensuite, j’ai donc implémenté l’interface IRepeatInfoUser qui permet justement de créer un contrôle qui répète une liste d’items. Rien de bien compliqué pour cette méthode, mise à part la méthode RenderItem() qui permet justement d’afficher les contrôles. En fait il suffit d’afficher simplement les contrôles avec la méthode monControle.Render(), en les ayant configurés selon la valeur de la collection Items.

Le soucis majeur est que ces contrôles, s’ils sont modifiables par l’utilisateur, doivent récupérer les valeurs modifiées avant le Postback. Ceci se fait en implémentant l’interface IPostBackDataHandler. Il faut inscrire les contrôles qui doivent renvoyer des données PostBack avant de les afficher dans la page en utilisant la méthode Page.RegisterRequiresPostBack().

Une fois les contrôles enregistrés, on récupère les données du Postback à l’aide de la méthode LoadPostData(), et il suffit de modifier les valeurs des Items à l’aide de ces valeurs récupérées du postback.

Enfin, j’ai aussi implémenté l’interface IPostBackEventHandler car je souhaitais que mes boutons supprime une ligne lorsque je cliquais dessus. C’est en gros le même principe que pour l’interface IPostBackDataHandler, il faut inscrire les boutons sur la page avec un string contenant une valeur permettant d’identifier l’action effectuée par l’utilisateur, puis une méthode dans le contrôle (RaisePostBackEvent) permet de récupérer cette valeur pour ensuite faire ce que l’on désire.

J’espère avoir été relativement clair et que cela pourra aider quelqu’un (pas sûr :roll: ). Mais je ne voulais pas ne rien expliquer, étant donné que l’on a été sympa avec moi et que l’on a essayé de m’aider. Voilà voilà, merci à tous… et à bientôt :stuck_out_tongue:

Et de nouveau, si quelqu’un veut plus de renseignement il m’envoie un PM ou écrit ici je réponds volontier! D’ailleurs avec le même genre de code on peut faire très facilement un contrôle permettant à un utilisateur d’uploader autant de fichiers qu’il le désire… pour ceux que ça intéresse :P.