Bonjour,
Je veux remplir une dropdownlist d'un gridview avec une requête linq to sql dans un edititemtemplates.
Merci. :ccool:
Version imprimable
Bonjour,
Je veux remplir une dropdownlist d'un gridview avec une requête linq to sql dans un edititemtemplates.
Merci. :ccool:
Purrais-tu reformuler ta demande ?
Merci
J'ai un gridview, je veux modifier une ligne grace à la fonction "edit".
Quand j'appuie sur "edit", j'ai un dropdownlist que j'ai mis dans un edititemtemplates ou je choisi un élément pour le modifier dans la base.
Je sais bien que pour remplir cette dropdownlist, je peux passer par un sqldatasource ou un linqdatasource mais je veux la remplir en code c#, et si possible grace à une requete linq to sql qui liste un champs d'une table de la BD, c'est a dire que les éléments du champs doivent être les elements de la dropdownlist.
Merci :ccool:
Bonjour,
Avant de commencer tout dev, il faut voir un petit comment fonctionne LinqToSql.
voilà un exemple d'un DropDowList qui se nourrit d'une requête Linq :
Code:
1
2
3
4
5
6
7
8
9
10
11 //Code c# //Préparer la requête LINQ var courses = (from c in context.CourseNames select new {Field=c.CName,Value=c.CId}).ToList(); this.dropDownList.DataSource = courses; dropDownList.DataTextField = "Field"; dropDownList.DataValueField = "Value"; dropDownList.DataBind(); //Code aspx <asp:DropDownList ID="dropDownList" runat="server"></asp:DropDownList>
Merci pour ta réponse, mon problème ne réside pas dans linq to sql, ni dans la facon dont je "nourris" ma dropdownlist, mais ce que je veux c'est comment faire cela à une ddl qui se trouve dans edititemtemplate d'un gridview. J'ai déjà essayer avec la méthode "findcontrol" du gridview pour récupérer la ddl et je l'ai "nourris" d'une requête linq comme dans ta réponse, et j'ai mis ce code dans le page_load mais pas de résultat.
:ccool:
Pourrais-tu nous montrer ton code ?
Voici mon code dans page_load :
Et voici l'erreur:Code:
1
2
3
4
5
6
7
8
9
10 ProjetDataClassesDataContext bd = new ProjetDataClassesDataContext(); foreach (GridViewRow row in gridview1.Rows) { DropDownList dp1 = (DropDownList)row.FindControl("drpPrix"); var id = (from a in bd.Prix select a).ToList(); dp1.DataSource = id; dp1.DataTextField = "field"; dp1.DataValueField = "value"; dp1.DataBind(); }
à la ligne :Citation:
System.NullReferenceException: Object reference not set to an instance of an object.
Code:dp1.DataSource = id;
Il y a à mon sens plusieurs choses à faire.
Avant de remplir ta liste, il faut vérifier que tu es bien en mode edit sur ta grid (ou au moins que ta liste existe)
Ensuite, je pense que tu dois nourrir ta liste déroulante lorsque tu passes en mode edit pour la ligne en question et non dans le page_load (c'est trop tôt je pense)
Fais le sur le databound de tes lignes, cela me semble plus approprié
Ton FindControl doit fonctionner lorsque tu es en mode Edit de ton row, essaye ce code en ajout un nouveau event à ton grid et le supprimant du page load:
Code:
1
2
3
4
5
6
7
8 protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow && (e.Row.RowState & DataControlRowState.Edit) > 0) { //Find the control here }
J'ai essayé la solution de mimosa, ça me donne une liste vide, et pour jbrasselet, d'après ce que j'ai compris de sa solution c'est de mettre mon code dans l’évènement row_editing de la gridview (corrige moi si c'est pas ça), mais c'est la même erreur.
N.B.: Quand j'applique le même code à une ddl en dehors du grid, la ddl est remplis.
Quand j'utilise pour ma ddl du grid un sqldatasource ou un linq datasource avec l'assistance, ça marche (mais ce que je veux c'est par code).
J'ai un doute concernant cette ligne de code :
Mets un point d'arrêt sur cette ligne et testes si ta source est vide ou pas.Code:
1
2 var id = (from a in bd.Prix select a).ToList();
Liste vide toujours mais je ne crois pas que la source est vide, comme j'ai dis , j'applique la même requête à une ddl en dehors du grid => ddl remplis !
Essayes avec l'évènement RowDataBound
Code:
1
2
3
4
5
6
7 protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (grdDevelopment.EditIndex == e.Row.RowIndex && e.Row.RowType==DataControlRowType.DataRow) { //Vérifie l'index de la cellule qui contient ta liste déroulante, dans cas il s'agit de la colonne n°1 DropDownList drpBuildServers = (DropDownList)e.Row.Cells[0].FindControl("ddl"); } }
Merci mimosa pour ta solution, ca marche !
J'ai juste un petit probleme maintenant: apres avoir choisi mon element dans la ddl dans"edit", quand je clique sur "update", ma valeur n'est pas modifiée, avec le sqldatasource j'utilisais ddl.selectedvalue="value", à l'aide de "edit databindings" du grid avec l'assistant, maintenant ca ne se modifie plus, ni avec le code ni avec l'assistant.
Desolé d''avoir posé un autre problème, mais celui ci completera la solution de remplissage du grid, car il est necessaire de modifier cette valeur par celle choisi dans la ddl sinon ce remlissage ne servira à rien !
Merci :ccool:!
Essayes d'utiliser google ;)
Personnellement, je ne viens poser ma question sur ce forum qu’après avoir chercher sur google et fais plusieurs tentatives.
J'ai deja essayé de resoudre ce problème en remplissant ma ddl avec un sqldatasource ou un linqdatasource en mettant dans le bind de la ddl:
Maintenant qu'on a trouvé comment la remplir par code, ce selectedvalue ne marche plus. Donc je ne pourrais plus la modifier. Est ce j'ai oublié quelque chose ?Code:SelectedValue='<%# Bind("idprix") %>'
Je sais que cela peut être fais avec une instruction de modification sql (ou linq) dans la BD, mais ce qui m'intrigue c'est pourquoi le selectedvalue ne marche plus dans ce cas.
Je ne comprends pas ton problème : est ce que tu veux sélectionner par défaut ta liste déroulante à partir d'un champ de ta base de donnée, ou bien tu souhaites faire une requête update depuis ton grid (y compris la DDL) vers ta base ?
Bon comme c'est un autre sujet de discussion, je vais essayer de le lancer à part, merci en tout cas pour ta réponse ! :ccool: