datagrid:problème avec edit

psyk
datagrid:problème avec edit

Re-Bonjour tout le monde,
je suis encore avec mon datagrid, et maintenant, j'essaie de pouvoir modifier une ligne de mon datagrid.
j'ai un bouton modifier a la derniere colonne de mon datagrid (l'image est un crayon). et lorsque je clique dessus, j'aimerais que la ligne sélectionnée affiche des dropdownlist et des texbox pour que mon utilisateur puisse modifier la ligne. Mais malheureusement, j'ai plein de problème.

Voici mon code lorsque l'on clique sur le petit crayon:

private void datagrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
	switch(e.CommandName)
	{
		case "Edit" :
			datagrid.EditItemIndex = e.Item.ItemIndex ;
			break;
	}
}

alors lorsque que je clique, il ne se passe rien du tout, c'est seulement au deuxième clique que mon erreur apparaît. Pourquoi est ce que j'ai besoin de cliquer deux fois?
et en PLUS, il ne va jamais dans ma fonction d'au dessus, c'est pourtant un itemCommand lorsque je clique dessus non?

et deuxièment, lorsqu'il me donne mon erreur, il affiche ceci:

Quote:
Échec du chargement de viewstate. L'arborescence du contrôle sur lequel viewstate est chargé doit correspondre à l'arborescence du contrôle qui a été utilisé pour enregistrer viewstate lors de la demande précédente. Par exemple, lors de l'ajout dynamique de contrôle, les contrôles ajoutés lors d'une publication doivent correspondre au type et à la position des contrôles ajoutés lors de la demande initiale

voici le code de mon datagrid

<asp:datagrid id="dgAllocation" runat="server" Width="358px" Height="64px" AllowPaging="True" AutoGenerateColumns="False" PageSize="3" BorderColor="LightSteelBlue">
<EditItemStyle BackColor="LightBlue"></EditItemStyle>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
<HeaderStyle CssClass="HEADERSTYLE"></HeaderStyle>
	<Columns>
		<asp:TemplateColumn HeaderText="Type">
			<ItemTemplate>
				<asp:Label id="lblType" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Type") %>'></asp:Label>
			</ItemTemplate>
			<EditItemTemplate>
	                                    <asp:DropDownList id="cboDomaine" runat="server" Width="172px">
	                                    <asp:ListItem Value="RH">1</asp:ListItem>
				<asp:ListItem Value="Paie">2</asp:ListItem>
				<asp:ListItem Value="RH-Paie">3</asp:ListItem>
				</asp:DropDownList>					</EditItemTemplate>
		</asp:TemplateColumn>
										<asp:TemplateColumn HeaderText="Montant">
			<ItemTemplate>
				<asp:Label id="lblMontant" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Montant") %>'></asp:Label>
			</ItemTemplate>
			<EditItemTemplate>
			</EditItemTemplate>
		</asp:TemplateColumn>
		<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="<img border=0 src="images/icon-floppy.gif">" CancelText="<img border=0 src="images/icon-pencil-x.gif">" EditText="<img border=0 src="images/Modification.gif">"></asp:EditCommandColumn>
		<asp:ButtonColumn Text="<img border=0 src="images/icon-delete.gif">" CommandName="Delete"></asp:ButtonColumn>
								</Columns>
								<PagerStyle NextPageText="suivant >" PrevPageText="< précédent" CssClass="PAGERSTYLE"></PagerStyle>
								</asp:datagrid>

Avez-vous une idée de ce qui ne fonctionne pas avec mon code?
merci de m'aider

fredericmazue

Salut,

Quote:
j'ai un bouton modifier a la derniere colonne de mon datagrid (l'image est un crayon). et lorsque je clique dessus, j'aimerais que la ligne sélectionnée affiche des dropdownlist et des texbox pour que mon utilisateur puisse modifier la ligne. Mais malheureusement, j'ai plein de problème.

Si je comprends bien tu veux embarquer des contrôles dans ta grille c'est ça ?
D'abord, si tu es avec .Net 2.0, je me permets de te faire remarquer que Microsoft recommande d'utiliser GridView à la place de DataGrid. GridView. C'est le même en mieux qu'ils disent :)

Quote:
Voici mon code lorsque l'on clique sur le petit crayon: [...]

Heu je crains que ça ne soit un petit peu plus compliqué. je n'ai hélas pas le temps d'entrer dans les détails, mais je t'ai trouvé deux liens qui devraient faire ton bonheur :)
http://webthingsconsidered.blogspot.com/2005/09/dropdownlist-inside-gridview-or.html
http://gridviewguy.com/ArticleDetails.aspx?articleID=169
vince23

Bonjour,

Essaye ceci :

    protected void Page_Load(object sender, EventArgs e)
    {
        // initialisation
        this.dgAllocation.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAllocation_UpdateCommand);
        this.dgAllocation.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAllocation_DeleteCommand);
        this.dgAllocation.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(dgAllocation_EditCommand);
        chargementDuDatagrid();
    }

    private void dgAllocation_DeleteCommand(Object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
        // delete
        // puis on repasse en mode normal
        dgAllocation.EditItemIndex = -1
        chargementDuDatagrid();
    }

    private void dgAllocation_EditCommand(Object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
        // edit
        dgAllocation.EditItemIndex = e.Item.ItemIndex;
        chargementDuDatagrid();
    }

    private void dgAllocation_UpdateCommand(Object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
        // update
        // puis on repasse en mode normal
        dgAllocation.EditItemIndex = -1
        chargementDuDatagrid();
    }

    public void chargementDuDatagrid()
    {
        // chargement du datatgrid
        DataSet dt = new DataSet();

        DataTable table = new DataTable();
        DataColumn column = new DataColumn("Type");
        table.Columns.Add(column);
        DataColumn column1 = new DataColumn("Montant");
        table.Columns.Add(column1);

        DataRow row = table.NewRow();
        row["Type"] = "type1";
        row["Montant"] = "montant1";
        table.Rows.Add(row);
        dt.Tables.Add(table);
        dgAllocation.DataSource = dt;
        dgAllocation.DataBind();
    }

Il faut lier les méthodes aux évènements. Dans le page load, on initialise les différentes commandes possibles (update, delete, etc.). Ainsi, une méthode précise est executée au bon moment.

pour ton erreur, je l'ai eu aussi. En fait, c'est parce que tu fais :
datagrid.EditItemIndex = e.Item.ItemIndex ;
et derrière tu ne recharges pas ton datagrid

Donc lorsque tu le fais la deuxième fois, tu lui demandes de passer dans un état dans lequel il est, d'où l'erreur.

Il faut donc, après une modification de l'attribut EditItemIndex, recharger ton datagrid