Hello voilà comment il faut procéder.
dans la partie aspx tu n'utilise pas les controles aspBoundField mais tu définit des templates: un pour le mode visualisation et un pour le mode édition.Dedans tu met des texboxs ou autre pour lesquels tu peux mettre un identifiant qui te servira après, soit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
AutoGenerateEditButton="True" DataKeyNames="truc"
OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating"
onrowupdated="GridView1_RowUpdated"
ShowFooter="false"
onrowcommand="GridView1_RowCommand">
<Columns>
<asp:TemplateField HeaderText="nom" SortExpression="nom">
<EditItemTemplate>
<asp:TextBox ID="Label1" runat="server" Text='<%# Bind("nom") %>' />
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="Label2" runat="server" Text='<%# Eval("nom") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="truc" SortExpression="truc" >
<EditItemTemplate>
<asp:TextBox ID="Label3" runat="server" Text='<%# Bind("truc") %>' TextMode ="MultiLine" />
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="Label4" runat="server" Text='<%# Eval("truc") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EditRowStyle BackColor="#FF99CC" />
</asp:GridView> |
Dans mon exemple ma base contient deux colonnes : nom et truc, à toi d'adapter le code pour qu'il correspond à tes champs.
Dans le code behind:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
populateGridView();
}
}
private void populateGridView()
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True");
conn.Open();
SqlCommand comm = new SqlCommand("select * from gens", conn);
GridView1.DataSource = comm.ExecuteReader();
GridView1.DataBind();
conn.Close();
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
TextBox t1 = (TextBox)GridView1.Rows[e.RowIndex].FindControl("Label1");
TextBox t3 = (TextBox) GridView1.Rows[e.RowIndex].FindControl("Label3") ;
update(t3.Text, t1.Text);
GridView1.EditIndex = -1;
populateGridView();
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
populateGridView();
}
private void update(string text,string nom)
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True");
conn.Open();
SqlCommand comm = new SqlCommand("update gens set truc='" + text.Trim() + "' where nom='" + nom.Trim() + "';", conn);
comm.ExecuteNonQuery();
conn.Close();
} |
Les fonctions sont les suivante:- PopulateGridView qui remplit la GridView avec la source de donnée.
-Update qui modifie dans la base suivant les modifications fait dans les controles.
- row_Updating qui transmet à update ces modifications. Tu noteras que l'on peux utiliser findControl cette fois puisque les templates contiennent des controles avec des id.
-Et row_editing qui initialise l'édition.
Il faut faire bien attention de mettre if (!IsPostBack) avant le populateGridView du pageLoad car sinon lorsque tu clic sur update , cela déclenche un postback et les controles reprennent leur valeur de départ malgré le fait que tu ai tapé autre chose.
à plus
pardon j'ai pas réfléchis j'ai tout fais en c# . tu pourras traduire?
Partager