Ci-joint le code pour faire un gestionnaire de relations [n,n] dans une base de donnees avec une Gridview. Ici il s'agit de lier des droits às; des groupes d'utlisateurs. Un groupe d'utilisateurs pouvant avoir plusiseurs droits, un droit pouvant etre attribue à plusieurs groupes d'utilisateurs.
Les structures de tables:
_________ ________________ ______
|usergroup| |usergroup_right | |right |
|---------| |----------------| |------|
| id (PK) |------|id_usergroup(PK)| ,---|id(PK)|
| name | |id_right(PK) |---' |name |
--------- ---------------- ------
Source / Exemple :
/***Dans le fichier .aspx***/
<h3>Manage the rights associated to usergroups</h3>
<asp:GridView ID="GridView1" runat="server" DataSourceID="sds1" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="name" HeaderText="Usergroup" />
<asp:TemplateField HeaderText="Rights">
<ItemTemplate>
<asp:Label ID="idr" runat="server" Text='<%# Bind("id") %>' Visible="false" />
<asp:GridView BorderWidth="0" Width="100%" ID="GridView2"
runat="server" DataSource='<%# getRights(Eval("id")) %>' ShowHeader="False"
GridLines="Vertical" AutoGenerateColumns="false"
SkinID="dginside" EmptyDataText="None"
OnRowDeleting="Delete" >
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="idr" Text='<%# Bind("idr") %>' runat="server" Visible="false" />
<asp:Label ID="idg" Text='<%# Bind("idg") %>' runat="server" Visible="false" />
<asp:Label ID="rl" Text='<%# Bind("name") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="true" DeleteText="Remove" ControlStyle-Font-Underline="true" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="sds1" runat="server" ConnectionString="<%$ ConnectionStrings:connexion %>"
SelectCommand="Select * from usergroup">
</asp:SqlDataSource>
<br />
<div align="center">
<asp:Panel ID="Panel1" runat="server" Height="90px" HorizontalAlign="Center" Width="75%" BorderColor="#004770" BorderWidth="1px" CssClass="FieldHeader">
<asp:Label ID="Label1" runat="server" Text="Add a right to an usergroup"></asp:Label><br />
<asp:DropDownList ID="ddg" runat="server" DataSourceID="sds1" DataTextField="name"
DataValueField="id" AutoPostBack="true">
</asp:DropDownList>
<asp:DropDownList ID="ddr" runat="server" DataSourceID="sds3" DataValueField="id" DataTextField="name">
</asp:DropDownList>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Add" Width="75px" OnClick="Button1_Click" />
<asp:SqlDataSource ID="sds3" runat="server" ConnectionString="<%$ ConnectionStrings:connexion %>"
SelectCommand="Select * from [right] where id not in (select id_right from usergroup_right where id_usergroup=@group)" ProviderName="System.Data.SqlClient" //On n'affiche que les droits que le groupe n'a pas encore
InsertCommand="Insert into usergroup_right (id_usergroup,id_right) values (@idg,@idr)">
<SelectParameters>
<asp:ControlParameter ControlID="ddg" Name="group" PropertyName="SelectedValue" />
</SelectParameters>
<InsertParameters>
<asp:ControlParameter ControlID="ddg" Name="idg" PropertyName="SelectedValue" />
<asp:ControlParameter ControlID="ddr" Name="idr" PropertyName="SelectedValue" />
</InsertParameters>
</asp:SqlDataSource>
</asp:Panel>
/***Dans le fichier .aspx.cs***/
/***Ajoute un droit au groupe***/
protected void Button1_Click(object sender, EventArgs e)
{
sds3.Insert();
sds1.Select(DataSourceSelectArguments.Empty);
Page.DataBind();
}
/***Retire un droit au groupe***/
protected void Delete(object sender, GridViewDeleteEventArgs e)
{
String right=((Label)((GridView)sender).Rows[e.RowIndex].Cells[0].FindControl("idr")).Text;
String group = ((Label)((GridView)sender).Rows[e.RowIndex].Cells[0].FindControl("idg")).Text;
String Sql = "Delete from [usergroup_right] where id_usergroup='" + group + "' and id_right='" + right + "'";
SqlConnection con=new SqlConnection(ConfigurationManager.ConnectionStrings["connexion"].ConnectionString);
con.Open();
SqlCommand Com=con.CreateCommand();
Com.CommandText=Sql;
Com.ExecuteNonQuery();
con.Close();
GridView1.DataBind();
}
/***Retourne les droits associes a l'id du groupe***/
public DataSet getRights(object usergroup)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connexion"].ConnectionString);
String SQl= "Select r.id as 'idr',r.name,ur.id_usergroup as 'idg' from [right] r,[usergroup_right] ur where r.id=ur.id_right and ur.id_usergroup=" + usergroup;
SqlDataAdapter Adapt = new SqlDataAdapter(SQl, con);
DataSet Result = new DataSet();
Adapt.Fill(Result,"right");
con.Close();
return Result;
}
Conclusion :
Vous aurez remarque ;-) que cet exemple traite des choses suivantes:
-Gridview complet (ajout, suppression, edition)
-Edition de colonnes avec DropDownList (cles etrangeres)
-Inclusion de gridview dans une autre Gridview
Si vous avez une question ou une remarque n'hesitez pas.