2011-06-14 10 views
1

J'ai un problème avec EditItemTemplate. Ce que j'essaye de faire est de mettre à jour mon TextBox txt_name mais je ne peux pas obtenir ce que l'utilisateur ingère Et j'obtiens l'ancienne valeur à la place au code-behind.Accéder à EditItemTemplate à partir de CodeBehind

Ai-je raté quelque chose?

CODE AVANT

<asp:GridView ID="GridView_account" runat="server" AutoGenerateColumns="false" ShowFooter="True" 
    OnRowCancelingEdit="GridView_account_RowCancelingEdit" OnRowEditing="GridView_account_RowEditing" 
    OnRowUpdating="GridView_account_RowUpdating" OnRowCommand="GridView_account_RowCommand" 
    OnRowDeleting="GridView_account_RowDeleting" OnSelectedIndexChanged="GridView_account_SelectedIndexChanged" 
    DataKeyNames="UID" Height="110px" Width="497px"> 
    <Columns> 
     <asp:TemplateField HeaderText="UID" SortExpression="UID"> 
      <ItemTemplate> 
       <asp:Label ID="label_accid" runat="server" Text='<%# Bind("UID") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="User Name (required)" SortExpression="NyA"> 
      <EditItemTemplate> 
       <asp:TextBox ID="txt_name" runat="server" Text='<%# Bind("NyA") %>'/> 
      </EditItemTemplate> 
      <FooterTemplate> 
       <asp:TextBox ID="txt_newname" runat="server"></asp:TextBox> 
      </FooterTemplate> 
      <ItemTemplate> 
       <asp:Label ID="label_name" runat="server" Text='<%# Bind("NyA") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Email Address (required)" SortExpression="eMail"> 
      <EditItemTemplate> 
       <asp:TextBox ID="txt_email" runat="server" Text='<%# Bind("eMail") %>'></asp:TextBox> 
      </EditItemTemplate> 
      <FooterTemplate> 
       <asp:TextBox ID="txt_newemail" runat="server"></asp:TextBox> 
      </FooterTemplate> 
      <ItemTemplate> 
       <asp:Label ID="label_email" runat="server" Text='<%# Bind("eMail") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Options" ShowHeader="False"> 
      <EditItemTemplate> 
       <asp:LinkButton ID="LinkButton_update" runat="server" CausesValidation="True" CommandName="Update" 
        Text="Update"></asp:LinkButton> 
       <asp:LinkButton ID="LinkButton_cancel" runat="server" CausesValidation="False" CommandName="Cancel" 
        Text="Cancel"></asp:LinkButton> 
       <asp:LinkButton ID="LinkButton_delete" runat="server" CausesValidation="False" CommandName="Delete" 
        Text="Delete"></asp:LinkButton> 
      </EditItemTemplate> 
      <FooterTemplate> 
       <asp:LinkButton ID="LinkButton_addnew" runat="server" CausesValidation="False" CommandName="AddNew" 
        Text="Add New"></asp:LinkButton> 
      </FooterTemplate> 
      <ItemTemplate> 
       <asp:LinkButton ID="LinkButton_edit" runat="server" CausesValidation="False" CommandName="Edit" 
        Text="Edit"></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Manage Role" ShowHeader="False"> 
      <ItemTemplate> 
       <asp:LinkButton ID="Selectbtn" runat="server" CausesValidation="False" CommandName="Select" 
        Text="Select"></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

CODE DERRIÈRE

protected void GridView_account_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    user u = Business.GetUser(((Label)GridView_account.Rows[e.RowIndex].FindControl("label_accid")).Text); 
    //HERE'S MY PROBLEM! 
    u.fullname = ((TextBox)GridView_account.Rows[e.RowIndex].FindControl("txt_name")).Text; 
    //txt_name is returning the old value and not the one the user has input recently. 

    Business.UpdateUser(u); 
    GridView_account.EditIndex = -1; 
    fillgridview(); 
}// 
+0

Cela fait longtemps que je n'ai pas fait ma dernière page, donc des choses comme PostBack sont des choses que je pourrais rater – apacay

Répondre

2

vérifient vous si la page IsPostBack lors de la liaison de votre réseau? Vous ne devez pas le relier dans le Page_Load s'il s'agit d'un postback, sinon vous perdrez les nouvelles valeurs, car les événements Page Init, Page Load surviennent avant d'autres événements, tels qu'un événement Grid Updating.

+0

Merci d'avoir répondu, je vais vérifier et vous dire. Vous avez peut-être raison là-dessus ... =) – apacay

1

Peut-être que vous liez votre grille sur chaque événement page_load. Si oui, vous avez besoin quelque chose comme ceci:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack) 
    { 
     GridView_account.DataSource = "data source"; 
     GridView_account.DataBind(); 
    } 
} 

ou au lieu de

if(!Page.IsPostBack) 

vous pouvez utiliser

if (GridView_account.EditIndex == -1) 

ce contrôle, si la grille est en mode édition. Si la grille n'est pas en mode édition, vous pouvez lier votre grille avec la source de données.

+0

Grande réponse, vous avez également raison. Merci! – apacay

Questions connexes