.net2 gestionnaire de relations [n,n] avec gridview.

Contenu du snippet

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>
        &nbsp;<br />
        &nbsp;
        <div align="center">
        <asp:Panel ID="Panel1" runat="server" Height="90px" HorizontalAlign="Center" Width="75%" BorderColor="#004770" BorderWidth="1px" CssClass="FieldHeader">
            &nbsp;
        <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.

A voir également