Comment lier un detailsview à un gridview [Résolu]

Signaler
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010
-
coccolata
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010
-
salut,je veux éditer mon gridview pour cette raison je vex employer un detailsview qui chargera la ligne sélectionnée du gridview
mais le problème je sais pas comment le faire
ni quels evements dois-je utiliser ni comment basculer entre les mode du detailsview
que sera mon datasource du detailsview??? j'ai fait dans form_load

protected
void Page_Load(
object sender,
EventArgs e){

 

if (!IsPostBack){

string message =
"impossible de charger la liste de pointage";

string mat = Session[
"matricule"].ToString();

string firstName = Session[
"prenom"].ToString();

string lastName = Session[
"nom"].ToString();

DataSet ds =
new
DataSet();DataAccess.

DBRequests db =
new DataAccess.
DBRequests();ds = db.Select(

"SELECT * FROM pointages WHERE pMatricule=" + mat); 

Response.Write(

"bonjour " + firstName +
" " + lastName);

// chargement de la liste des pointages

if (ds.Tables[0].Rows.Count > 0){

GVpointageE.DataSource = ds.Tables[0];

GVpointageE.DataBind();

DetailsView1.DataSource = ds;

DetailsView1.DataBind();

-------------------------
et puis
 

protected
void GVpointageE_SelectedIndexChanged(
object sender,
EventArgs e){

DetailsView1.PageIndex = GVpointageE.SelectedIndex;

DetailsView1.DataBind();

-----------------------
mais ça marche pas
merci en avance

<!-- / message -->

8 réponses

Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
lol je crois savoir d'ou viens ton probleme.
Dans ton detailsview tu as mis AutoGenerateRows="false", donc il ne va rien générer du tout. Donc soit tu met la propriété a true (par défaut), soit tu définis un template en prenant les champs que tu veux afficher.
Ca devrait fonctionner maintenant (et aussi avec la manière que tu utilisais auparavant (SelectedIndex) bien que je trouve "dommage" de bind toutes les données à la fois sur gridview et detailsview ca fait bcp de données enfin bon a toi de voir mais une maniere ou l'autre ca devrait etre ok maintenant.
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
as-tu réellement besoin de bind toutes tes données sur la gridview ET la detailsview dans le page_load?
Si non, tu pourrais faire comme ceci:

dans ton SelectedIndexChanged tu executes une requete sur la database db.Select
("SELECT * FROM pointages WHERE xxxx=" + GVpointageE.SelectedValue) en prenant soin de preciser un datakey (correspondant a l'id de la table généralement) pour ta gridview (DataKeyNames="xxxx").

Sinon tu pourrais considerer l'utilisation des objectdatasources (ou sqldatasources mais bon...) plutot que de passer par des dataset et tout faire a la mano. Ainsi tu pourrais choisir ta requete de selection du detailsview et lui attribuer comme parametre de filtrage un controlId correspondant au selectedvalue de ta gridview (cf. [as-tu réellement besoin de bind toutes tes données sur la gridview ET la detailsview dans le page_load? Si non, tu pourrais faire comme ceci: dans ton SelectedIndexChanged tu executes une requete sur la database db.Select("SELECT * FROM pointages WHERE xxxx=" + GVpointageE.SelectedValue) en prenant soin de preciser un datakey pour ta gridview bien sur(DataKeyNames="xxxx"). Asp.net/learn] par exemple)
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

merci d'abord de m'avoir répondu assez vite
j'ai besoin de bind des données de GridView mais pour le detailview j'ai besoin seulement des donnée de la ligne selectionnée du GV, pour avoir la main de faire des modification


bref j'ai fait ceci:

j'ai enlevé le chargement du detailview dans le load  et j'ai modifié GVpointageE_SelectedIndexChanged









protected





void

GVpointageE_SelectedIndexChanged(


object

sender,


EventArgs

e){













DataSet

ds =


new





DataSet

();
//GVpointageE.DataKeyNames = "id";     celle ci ne marche pas car  GVpointageE.DataKeyNames renvoie un tableau de string qui ne peut pas etre conerti en string, donc j'ai déclaré mon id comme si un tableau de 1 elt

GVpointageE.DataKeyNames = new
string[]{
"id"} ;
DataAccess.

DBRequests db =
new DataAccess.
DBRequests();ds = db.Select(

"SELECT * FROM pointages WHERE id="+ GVpointageE.SelectedRow.Cells[1]);DetailsView1.DataSource = ds;

DetailsView1.DataBind();
}

cela m'a généré une erreur : plusieurs identifiants bound impossible
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
pour commencer tu peux tout simple mettre GvpointageE.SelectedValue c'est plus "simple" ^^, quant à l'id j'avoue que je comprend pas pkoi il te dit que tu as plusieurs identifiants. Es-tu sur de n'en avoir pas déclaré directement dans la gridview dans ton code asp?
Pour ma part j'ai fait un test la de cette manière sauf qu'au lieu de déclarer le DataKeyNames en code behind je le met directement dans le code asp et cela fonctionne parfaitement. Essaye de ton coté de la mm manière (dans le code asp) et si ca ne fonctionne, ben...on verra ^^
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

pour le probleme précédent c'est réglé, plus de bugs en fait j'ai oublié de mettre .Text (GVpointageE.SelectedRow.Cells[1].Text)
 quand je selectionne la ligne que je vourdrais afficher en détails je detailsview ne se charge pas : il est vide, je m'explique : il y'a affichage seulement de 2 links ( Mettre à jour  Annuler)

apropos
quand j'ai cherché sur le net une solution est proposé est ;




protected





void

GVpointageE_SelectedIndexChanged(


object

sender,


EventArgs

e)



{


DetailsView1.PageIndex = GVpointageE.SelectedIndex;


DetailsView1.DataBind();
}
mais encore ça marche pas
quelques part j'ai trouvé que je dois insérer un objet data source dans le code aspx mais j'arrive pas a le faire car j'ai programmé la couche metier a part (dans un module) qui me renvoi seulement un dataset donc le data source ça sera pas reconnu...

je me sens égarée, rien ne fonctionne, et j'ai épuisé toutes mes idées 
je comprends pas pourquoi le detailsview ne se charge pas!!!!!!!!
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
Premièrement, tu peux bien sur utiliser un Dataset avec objectdatasource control: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.aspx

Sinon pour le fait que ca ne marche pas dans ton cas je ne vois vraiment pas, car moi ici cela fonctionne (code fait a la va-vite mais bon pour le principe encore une fois):

protected void myGv_SelectedIndexChanged(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(@"Server=.\SQLExpress;Database=AdventureWorks;UID=myUser;PWD=myPassword;"))
    {        string requete "SELECT * FROM Production.Product WHERE ProductID " + myGv.SelectedValue;
        SqlDataAdapter dataAdapter = new SqlDataAdapter(requete, conn);
        DataSet ds = new DataSet();
        dataAdapter.Fill(ds);
        myDetailView.DataSource = ds.Tables[0].DefaultView;
        myDetailView.DataBind();
    }
}

Au pire met un breakpoint dans ton selectedindechanged et verifier que myGv.SelectedValue retourne bien ce qu'elle devrait retourner.
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

vraiment je comprends rien! mon code est similaire à le tien..je l'ai meme modifié comme  ta version mais en vain le meme probleme persisite encore!!!!
voila exactement ce que j'ai écrit:


protected
void GVpointageE_SelectedIndexChanged(
object sender,
EventArgs e)


{




//DetailsView1.PageIndex = GVpointageE.SelectedIndex;










//DetailsView1.DataBind(); 










//DetailsView1.PageIndex = GVpointageE.PageIndex * (GVpointageE.PageSize) + (GVpointageE.SelectedIndex);








//DetailsView1.DataBind(); 










DataSet

ds1 =


new





DataSet

();



//GVpointageE.DataKeyNames = new string[] { "id" };








//GVpointageE.DataKeyNames = "id";


DataAccess.





DBRequests

db =


new

DataAccess.


DBRequests

();ds1 = db.Select(



"SELECT * FROM pointages WHERE id="

+ GVpointageE.SelectedValue);DetailsView1.DataSource = ds1.Tables[0].DefaultView ;

DetailsView1.DataBind();

 

}

le code aspx:



<


asp


:


GridView





ID


="GVpointageE"





runat


="server"





DataKeyNames


="id"





CellPadding


="4"





ForeColor


="#333333"








GridLines


="Horizontal"





Width


="319px"





Caption


="Liste de pointage"





Font-Overline


="False"





Font-Strikeout


="False"





CellSpacing


="1"





OnSelectedIndexChanged


="GVpointageE_SelectedIndexChanged">








<


FooterStyle





BackColor


="#507CD1"





Font-Bold


="True"





ForeColor


="White"





/>








<


RowStyle





BackColor


="#EFF3FB"





/>








<


EditRowStyle





BackColor


="#2461BF"





/>








<


SelectedRowStyle





BackColor


="#D1DDF1"





Font-Bold


="True"





ForeColor


="#333333"





Wrap


="True"





/>








<


PagerStyle





BackColor


="#2461BF"





ForeColor


="White"





HorizontalAlign


="Center"





/>








<


HeaderStyle





BackColor


="#507CD1"





Font-Bold


="True"





ForeColor


="White"





/>








<


AlternatingRowStyle





BackColor


="White"





Wrap


="True"





/>








<


PagerSettings





Position


="Top"





/>








<


EmptyDataRowStyle





Font-Strikeout


="False"





Font-Underline


="False"





/>








<


Columns


>








<


asp


:


CommandField





ShowSelectButton


="True"





/>








</


Columns


>








</


asp


:


GridView


>

<

asp:DetailsViewID="DetailsView1"runat="server"CellPadding="4"DefaultMode="Edit"Height="50px"

Width="125px"
AutoGenerateEditButton="True"
BackColor="White"
BorderColor="#CC9966"
BorderStyle="Dotted"
BorderWidth="1px"
Font-Bold="False"
Font-Names="Calibri"
Font-Overline="False"
OnPageIndexChanging="DetailsView1_PageIndexChanging"
AutoGenerateRows="False"
DataKeyNames="id"
AllowPaging="True">

<FooterStyle
BackColor="#FFFFCC"
ForeColor="#330099"
/>

<RowStyle
BackColor="White"
ForeColor="#330099"
/>

<PagerStyle
BackColor="#FFFFCC"
ForeColor="#330099"
HorizontalAlign="Center"
/>

<HeaderStyle
BackColor="#990000"
Font-Bold="True"
ForeColor="#FFFFCC"
/>

<EditRowStyle
BackColor="#FFCC66"
Font-Bold="True"
ForeColor="#663399"
/>

<PagerSettings
Mode="NextPreviousFirstLast"
/>

</asp:DetailsView>

bien sur que j'ai suivi l'exection par un breakpoint et f10 ...tout ça fonctionneje comprends pas ou la faille dans mon code
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

bonjour je suis super contente merciiiiiiiiiiiiiiiiiii merciiiiiiiiiiiiii merciiiiiiii   finalment ça fontionnee
en fait vous avez raison j'aurais pa du commettre cette betise! j'ai pensé que en mettant


AutoGenerateRows





="False"  le detailsview ne sera pas généré automatiquement mais sera déclenché seulement par l'evenement SelectedIndexChanged lors de la selection de  ligne du gridview
j'ai tort car le chargement automatique est la tache de load!
merci une autre fois RougailSaucisse pour ton aide