OVH Cloud OVH Cloud

liaison de donnée sur label dans un datagrid

13 réponses
Avatar
grome
J'ai récupéré un exemple de code pour mettre en oeuvre un datagrid. Le code
qui suit contient une instruction en VB je ne sais pas comment l'écrire en
C#.
Est ce que quelqu'un pourrait me venir en aide.

L'instruction <%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name") %> est censé
faire
une liaison de donneé sur un contrôle label.

<Columns>
<asp:TemplateColumn HeaderText="[]"><ItemTemplate><asp:Checkbox
id="chkSelect"
Runat="server"></asp:Checkbox></ItemTemplate></asp:TemplateColumn>
<asp:BoundColumn DataField="title" HeaderText="title"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="publisher">
<ItemTemplate><asp:label id=lblPublisher runat="server" Text= '<%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name")
%>'></asp:label></ItemTemplate>
<EditItemTemplate><asp:dropdownlist id="ddlPublishers" runat="server"
DataValueField="pub_id"
DataTextField="pub_name"></asp:dropdownlist></EditItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="type" HeaderText="type">
</asp:BoundColumn>
<asp:BoundColumn DataField="price" HeaderText="price">
</asp:BoundColumn>
<asp:EditCommandColumn ButtonType="PushButton" UpdateText="Mettre &#224;
jour" HeaderText="edit" CancelText="Annuler" EditText="Modifier">
</asp:EditCommandColumn>
<asp:ButtonColumn Text="Supprimer" ButtonType="PushButton"
HeaderText="delete" CommandName="Delete">
</asp:ButtonColumn>
<asp:HyperLinkColumn Text="publisher" DataNavigateUrlField="pub_id"
DataNavigateUrlFormatString="/showpubs.aspx?pub_id={0}" HeaderText="More
Info">
</asp:HyperLinkColumn>
</Columns>

10 réponses

1 2
Avatar
Roman
"grome" a écrit :

J'ai récupéré un exemple de code pour mettre en oeuvre un datagrid. Le code
qui suit contient une instruction en VB je ne sais pas comment l'écrire en
C#.
Est ce que quelqu'un pourrait me venir en aide.

L'instruction <%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name") %> est censé
faire
une liaison de donneé sur un contrôle label.



En C# ça fait:

Container.DataItem.Row.GetParentRow("Nom de liason de donées")["Nom de
collone"]

ou

"Nom de liason" - c'est le nom d'objet DataRelation attaché à vos sources de
données (par ex: deux DataSet),

"Nom de collone" - c'est le nom de collone dans l'objet DataRow renvoyé par
la fonction GetParentRow
Avatar
Paul Bacelar
<%Container.DataItem.Row.GetParentRow["PubsTitles"]["pub_name"] %>

Pas vérifié ;-)
--
Paul Bacelar

"grome" wrote in message
news:426fb841$0$3732$
J'ai récupéré un exemple de code pour mettre en oeuvre un datagrid. Le


code
qui suit contient une instruction en VB je ne sais pas comment l'écrire en
C#.
Est ce que quelqu'un pourrait me venir en aide.

L'instruction <%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name") %> est censé
faire
une liaison de donneé sur un contrôle label.

<Columns>
<asp:TemplateColumn HeaderText="[]"><ItemTemplate><asp:Checkbox
id="chkSelect"
Runat="server"></asp:Checkbox></ItemTemplate></asp:TemplateColumn>
<asp:BoundColumn DataField="title" HeaderText="title"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="publisher">
<ItemTemplate><asp:label id=lblPublisher runat="server" Text= '<%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name")
%>'></asp:label></ItemTemplate>
<EditItemTemplate><asp:dropdownlist id="ddlPublishers" runat="server"
DataValueField="pub_id"
DataTextField="pub_name"></asp:dropdownlist></EditItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="type" HeaderText="type">
</asp:BoundColumn>
<asp:BoundColumn DataField="price" HeaderText="price">
</asp:BoundColumn>
<asp:EditCommandColumn ButtonType="PushButton" UpdateText="Mettre &#224;
jour" HeaderText="edit" CancelText="Annuler" EditText="Modifier">
</asp:EditCommandColumn>
<asp:ButtonColumn Text="Supprimer" ButtonType="PushButton"
HeaderText="delete" CommandName="Delete">
</asp:ButtonColumn>
<asp:HyperLinkColumn Text="publisher" DataNavigateUrlField="pub_id"
DataNavigateUrlFormatString="/showpubs.aspx?pub_id={0}" HeaderText="More
Info">
</asp:HyperLinkColumn>
</Columns>





Avatar
grome
Ben j'avais déjà tenté mais cela ne fonctionne pas.
merci quand même.

Paul Bacelar a écrit :
<%Container.DataItem.Row.GetParentRow["PubsTitles"]["pub_name"] %>

Pas vérifié ;-)


Avatar
Sylvain Lafontaine
Vous avez oublié le # après le <% ; requis dans le cas du Binding afin
l'exécution de la requête soit retardée jusqu'au moment de l'appel à
l'événement de liaison (binding).

Voir autre message.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"grome" wrote in message
news:427089e0$0$24151$
Ben j'avais déjà tenté mais cela ne fonctionne pas.
merci quand même.

Paul Bacelar a écrit :
<%Container.DataItem.Row.GetParentRow["PubsTitles"]["pub_name"] %>

Pas vérifié ;-)




Avatar
Sylvain Lafontaine
Cette commande ne fait pas seulement la liaison avec une étiquette de donnée
mais recherche également la valeur correspondante "pub_name" de la table
PubsTitles dans la clef étrangère correspondant à la clef primaire de la
fiche courante.

Cette commande ne marchera évidemment pas si vous n'avez pas établit de
relation entre votre table PubsTitles et la table courante dans votre
dataset. Si c'est vraiment ce que vous voulez et que vous voulez faire un
lookup sur la clef secondaire, la syntaxe complète en C# est:

<asp:Label runat="server" Text='<%#
DataBinder.Eval(((System.Data.DataRowView)Container.DataItem).Row.GetParentRow
("PubsTitles"), "pub_name") %>' ID="Label4" />

mais normalement, pour les liaison de donnée sur un contrôle Label, vous
devriez utiliser quelque chose comme:

... <%# DataBinder.Eval(Container, "DataItem.pub_name") %> ...

N'oubliez pas de mettre votre # après le <% .

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"grome" wrote in message
news:426fb841$0$3732$
J'ai récupéré un exemple de code pour mettre en oeuvre un datagrid. Le
code
qui suit contient une instruction en VB je ne sais pas comment l'écrire en
C#.
Est ce que quelqu'un pourrait me venir en aide.

L'instruction <%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name") %> est censé
faire
une liaison de donneé sur un contrôle label.

<Columns>
<asp:TemplateColumn HeaderText="[]"><ItemTemplate><asp:Checkbox
id="chkSelect"
Runat="server"></asp:Checkbox></ItemTemplate></asp:TemplateColumn>
<asp:BoundColumn DataField="title" HeaderText="title"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="publisher">
<ItemTemplate><asp:label id=lblPublisher runat="server" Text= '<%#
Container.DataItem.Row.GetParentRow("PubsTitles")("pub_name")
%>'></asp:label></ItemTemplate>
<EditItemTemplate><asp:dropdownlist id="ddlPublishers" runat="server"
DataValueField="pub_id"
DataTextField="pub_name"></asp:dropdownlist></EditItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="type" HeaderText="type">
</asp:BoundColumn>
<asp:BoundColumn DataField="price" HeaderText="price">
</asp:BoundColumn>
<asp:EditCommandColumn ButtonType="PushButton" UpdateText="Mettre &#224;
jour" HeaderText="edit" CancelText="Annuler" EditText="Modifier">
</asp:EditCommandColumn>
<asp:ButtonColumn Text="Supprimer" ButtonType="PushButton"
HeaderText="delete" CommandName="Delete">
</asp:ButtonColumn>
<asp:HyperLinkColumn Text="publisher" DataNavigateUrlField="pub_id"
DataNavigateUrlFormatString="/showpubs.aspx?pub_id={0}" HeaderText="More
Info">
</asp:HyperLinkColumn>
</Columns>





Avatar
grome
"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news:
Cette commande ne fait pas seulement la liaison avec une étiquette de
donnée mais recherche également la valeur correspondante "pub_name" de la
table PubsTitles dans la clef étrangère correspondant à la clef primaire
de la fiche courante.

Cette commande ne marchera évidemment pas si vous n'avez pas établit de
relation entre votre table PubsTitles et la table courante dans votre
dataset. Si c'est vraiment ce que vous voulez et que vous voulez faire
un lookup sur la clef secondaire, la syntaxe complète en C# est:





Oui c'est exactement ce que je veux faire. J'ai construit un dataset avec le
code ci dessous.

System.Data.OleDb.OleDbConnection oledbCN = new
System.Data.OleDb.OleDbConnection();
oledbCN.ConnectionString = Session["ChaineConnexion"].ToString();
oledbCN.Open();
// remplit le DataTable titles
System.Data.OleDb.OleDbDataAdapter daTitles = new
System.Data.OleDb.OleDbDataAdapter("SELECT * FROM TITLES",oledbCN);
daTitles.Fill(ds,"Titles");
//remplit le datatable Publishers (avec les champs voulus)
System.Data.OleDb.OleDbDataAdapter daPubs = new
System.Data.OleDb.OleDbDataAdapter("SELECT pub_id , pub_name FROM
PUBLISHERS",oledbCN);
daPubs.Fill(ds,"Publishers");
// ferme la connexion
oledbCN.Close();
// cree la relation entre les deux tables
ds.Relations.Add("PubsTitles", ds.Tables["Publishers"].Columns["Pub_id"],
ds.Tables["Titles"].Columns["pub_id"]);


<asp:Label runat="server" Text='<%#
DataBinder.Eval(((System.Data.DataRowView)Container.DataItem).Row.GetParentRow
("PubsTitles"), "pub_name") %>' ID="Label4" />






Cela ne fonctionne pas j'obtiens le message d'erreur suivant.

DataBinder.Eval : 'System.Data.DataRow' ne comporte pas de propriété appelée
pub_name.

mais normalement, pour les liaisons de donnée sur un contrôle Label, vous
devriez utiliser quelque chose comme:

... <%# DataBinder.Eval(Container, "DataItem.pub_name") %> ...






... oui pour cette instruction c'est ok.


N'oubliez pas de mettre votre # après le <% .

--


Avatar
Sylvain Lafontaine
L'exemple que je vous ai donné est celui que j'ai utilisé moi-même dans le
passé; sa syntaxe devrait donc être bonne. Cependant, si votre « row » est
vide ou qu'elle n'a pas de ParentRow; alors là évidemment vous aurez un
message d'erreur.

Vous devriez utiliser le debugger pour voir où vous en êtes rendu après
l'appel à la fonction GetParentRow() ou essayer l'appel à cette function
directement dans votre C# afin de vérifier que vos relations sont correctes.
Vous pouvez également cacher toute cette évaluation dans une fonction et
regarder ce qui se passe en traçant cette fonction.

Cependant, puisque vous dites que cela fonctionne avec <%#
DataBinder.Eval(Container, "DataItem.pub_name") %> ; alors j'imagine que
c'est tout simplement parce que j'ai mal compris comment vous faisiez votre
liaison sur le DataGrid et que vous n'utilisez pas la même méthode que moi.
L'important, c'est que cela fonctionne maintenant.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"grome" wrote in message
news:4275d1dd$0$1554$

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news:
Cette commande ne fait pas seulement la liaison avec une étiquette de
donnée mais recherche également la valeur correspondante "pub_name" de
la table PubsTitles dans la clef étrangère correspondant à la clef
primaire de la fiche courante.

Cette commande ne marchera évidemment pas si vous n'avez pas établit de
relation entre votre table PubsTitles et la table courante dans votre
dataset. Si c'est vraiment ce que vous voulez et que vous voulez faire
un lookup sur la clef secondaire, la syntaxe complète en C# est:





Oui c'est exactement ce que je veux faire. J'ai construit un dataset avec
le code ci dessous.

System.Data.OleDb.OleDbConnection oledbCN = new
System.Data.OleDb.OleDbConnection();
oledbCN.ConnectionString = Session["ChaineConnexion"].ToString();
oledbCN.Open();
// remplit le DataTable titles
System.Data.OleDb.OleDbDataAdapter daTitles = new
System.Data.OleDb.OleDbDataAdapter("SELECT * FROM TITLES",oledbCN);
daTitles.Fill(ds,"Titles");
//remplit le datatable Publishers (avec les champs voulus)
System.Data.OleDb.OleDbDataAdapter daPubs = new
System.Data.OleDb.OleDbDataAdapter("SELECT pub_id , pub_name FROM
PUBLISHERS",oledbCN);
daPubs.Fill(ds,"Publishers");
// ferme la connexion
oledbCN.Close();
// cree la relation entre les deux tables
ds.Relations.Add("PubsTitles", ds.Tables["Publishers"].Columns["Pub_id"],
ds.Tables["Titles"].Columns["pub_id"]);


<asp:Label runat="server" Text='<%#
DataBinder.Eval(((System.Data.DataRowView)Container.DataItem).Row.GetParentRow
("PubsTitles"), "pub_name") %>' ID="Label4" />






Cela ne fonctionne pas j'obtiens le message d'erreur suivant.

DataBinder.Eval : 'System.Data.DataRow' ne comporte pas de propriété
appelée pub_name.

mais normalement, pour les liaisons de donnée sur un contrôle Label,
vous devriez utiliser quelque chose comme:

... <%# DataBinder.Eval(Container, "DataItem.pub_name") %> ...






... oui pour cette instruction c'est ok.


N'oubliez pas de mettre votre # après le <% .

--






Avatar
grome
En fait j'ai un Datagrid que je veux alimenter à partir d'un dataset.

Ce dataset possède deux tables TITLES et PUBLISHERS ainsi qu'une relation
PubsTitles créée sur pub_id.
L'idée est d'afficher dans le datagrid les TITLES (dgrTitles.DataSource =
ds.Tables["Titles"];). Seulement voilà une des colonnes (colonne modèle)
doit se comporter comme ci dessous :

En sélection le nom du publisher est affiché dans le datagrid dans un label.
(cette liaison ne fonctionne pas)
En edition dans la même colonne j'ai un dropdownlist pour pouvoir changer le
publisher (cette liaison fonctionne)

Pour la sélection si je code ceci (c'est pour l'exemple ) la liaison
fonctionne étant donné que pub_id est bien dans le datatable TITLES qui
alimente le datagrid

<asp:label id=lblPublisher runat="server" Text='<%# DataBinder.Eval
(Container.DataItem, "pub_id") %>'>
</asp:label>

Par contre le code ci dessous ne fonctionne pas mais je pense que je ne suis
pas très loin.

<%#DataBinder.Eval(((System.Data.DataRowView)Container.DataItem).Row.GetParentRow("PubsTitles"),
"pub_name") %>

J'ai essayé de Créer une fonction et de décomposer dans celle ci mais il n'y
a rien a faire le la propriété pub_name est introuvable dans le DataRow
ramené par GetParentRow

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news: %23aYiC$
L'exemple que je vous ai donné est celui que j'ai utilisé moi-même dans le
passé; sa syntaxe devrait donc être bonne. Cependant, si votre « row »
est vide ou qu'elle n'a pas de ParentRow; alors là évidemment vous aurez
un message d'erreur.

Vous devriez utiliser le debugger pour voir où vous en êtes rendu après
l'appel à la fonction GetParentRow() ou essayer l'appel à cette function
directement dans votre C# afin de vérifier que vos relations sont
correctes. Vous pouvez également cacher toute cette évaluation dans une
fonction et regarder ce qui se passe en traçant cette fonction.

Cependant, puisque vous dites que cela fonctionne avec <%#
DataBinder.Eval(Container, "DataItem.pub_name") %> ; alors j'imagine que
c'est tout simplement parce que j'ai mal compris comment vous faisiez
votre liaison sur le DataGrid et que vous n'utilisez pas la même méthode
que moi. L'important, c'est que cela fonctionne maintenant.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"grome" wrote in message
news:4275d1dd$0$1554$

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news:
Cette commande ne fait pas seulement la liaison avec une étiquette de
donnée mais recherche également la valeur correspondante "pub_name" de
la table PubsTitles dans la clef étrangère correspondant à la clef
primaire de la fiche courante.

Cette commande ne marchera évidemment pas si vous n'avez pas établit de
relation entre votre table PubsTitles et la table courante dans votre
dataset. Si c'est vraiment ce que vous voulez et que vous voulez faire
un lookup sur la clef secondaire, la syntaxe complète en C# est:





Oui c'est exactement ce que je veux faire. J'ai construit un dataset avec
le code ci dessous.

System.Data.OleDb.OleDbConnection oledbCN = new
System.Data.OleDb.OleDbConnection();
oledbCN.ConnectionString = Session["ChaineConnexion"].ToString();
oledbCN.Open();
// remplit le DataTable titles
System.Data.OleDb.OleDbDataAdapter daTitles = new
System.Data.OleDb.OleDbDataAdapter("SELECT * FROM TITLES",oledbCN);
daTitles.Fill(ds,"Titles");
//remplit le datatable Publishers (avec les champs voulus)
System.Data.OleDb.OleDbDataAdapter daPubs = new
System.Data.OleDb.OleDbDataAdapter("SELECT pub_id , pub_name FROM
PUBLISHERS",oledbCN);
daPubs.Fill(ds,"Publishers");
// ferme la connexion
oledbCN.Close();
// cree la relation entre les deux tables
ds.Relations.Add("PubsTitles", ds.Tables["Publishers"].Columns["Pub_id"],
ds.Tables["Titles"].Columns["pub_id"]);


<asp:Label runat="server" Text='<%#
DataBinder.Eval(((System.Data.DataRowView)Container.DataItem).Row.GetParentRow
("PubsTitles"), "pub_name") %>' ID="Label4" />






Cela ne fonctionne pas j'obtiens le message d'erreur suivant.

DataBinder.Eval : 'System.Data.DataRow' ne comporte pas de propriété
appelée pub_name.

mais normalement, pour les liaisons de donnée sur un contrôle Label,
vous devriez utiliser quelque chose comme:

... <%# DataBinder.Eval(Container, "DataItem.pub_name") %> ...






... oui pour cette instruction c'est ok.


N'oubliez pas de mettre votre # après le <% .

--










Avatar
grome
Bon en fait voilà comment je m'en suis sorti.

J'ai créé une fonction

public string GetPubName(DataRow dr)
{
string spubname = dr.GetParentRow("pubstitles").ItemArray[1].ToString()
;
return spubname;
}

dans le code html j'ai ceci


<asp:label id=lblPublisher runat="server" Text='<%# GetPubName
(((System.Data.DataRowView)Container.DataItem).Row ) %>'>
</asp:label>

Je n'ai pas réussi à l'écrire avec le Databinder.Eval.

Merci milles fois pour votre aide.
Avatar
Sylvain Lafontaine
Et si vous affichez le nom de la colonne ItemArray [i], qu'est-ce que cela
donne?

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"grome" wrote in message
news:42777e0f$0$305$
Bon en fait voilà comment je m'en suis sorti.

J'ai créé une fonction

public string GetPubName(DataRow dr)
{
string spubname = dr.GetParentRow("pubstitles").ItemArray[1].ToString()
;
return spubname;
}

dans le code html j'ai ceci


<asp:label id=lblPublisher runat="server" Text='<%# GetPubName
(((System.Data.DataRowView)Container.DataItem).Row ) %>'>
</asp:label>

Je n'ai pas réussi à l'écrire avec le Databinder.Eval.

Merci milles fois pour votre aide.



1 2