2009-02-24 5 views
4

J'ai un GridView comme ceci:ASP.NET - Aucune donnée sur l'événement Gridview RowDeleting!

<asp:GridView ID="gvwStudents" runat="server" 
    AutoGenerateColumns="False" DataKeyNames="ID" 
    ShowHeader="False" onrowdeleting="gvwStudents_RowDeleting"> 
    <Columns> 
     <asp:BoundField DataField="FirstName" /> 
     <asp:BoundField DataField="LastName" /> 
     <asp:BoundField DataField="Email" /> 
     <asp:CommandField ShowDeleteButton="True" DeleteText="Remove" /> 
    </Columns> 
</asp:GridView> 

Voici comment je crée mon DataTable, que le GridView est lié, afin que vous sachiez quelles sont les données que je traite:

private DataTable MakeStudentsTable() 
{ 
    DataTable students = new DataTable(); 

    DataColumn ID = students.Columns.Add("ID", typeof(int)); 
    ID.AutoIncrement = true; 

    DataColumn firstName = students.Columns.Add("FirstName", typeof(string)); 
    DataColumn lastName = students.Columns.Add("LastName", typeof(string)); 
    DataColumn email = students.Columns.Add("Email", typeof(string)); 


    return students; 
} 

Pourquoi, oh, pourquoi n'y a-t-il aucune clé transmise dans EventArgs de l'événement RowDeleting? Je dois supprimer l'enregistrement du DataTable ADO.NET que je conserve dans l'état de session lorsque cet événement est déclenché.

Pourquoi cela ne fonctionne-t-il pas? Est-ce que DataKeys ne fonctionne que lorsque vous utilisez un contrôle DataSource?

+0

Je pense que vous devez ajouter le tag "databinding" à cette question. BTW, je me suis cogné la tête sur exactement le même problème. –

+0

Comment ajoutez-vous des élèves à votre table? Les données sont-elles renseignées dans votre table avant l'appel de la méthode Deleting (c'est-à-dire dans Page_Load)? – cjk

Répondre

8

Cela fonctionne:

private DataTable MakeStudentsTable() 
{ 
    DataTable students = new DataTable(); 

    DataColumn ID = students.Columns.Add("ID", typeof(int)); 
    ID.AutoIncrement = true; 

    DataColumn firstName = students.Columns.Add("FirstName", typeof(string)); 
    DataColumn lastName = students.Columns.Add("LastName", typeof(string)); 
    DataColumn email = students.Columns.Add("Email", typeof(string)); 

    DataRow student = students.NewRow(); 
    student["FirstName"] = "foo"; 
    student["LastName"] = "bar"; 
    student["Email"] = "[email protected]"; 
    students.Rows.Add(student); 

    return students; 
} 

protected void gvwStudents_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    string id = this.gvwStudents.DataKeys[e.RowIndex].Value.ToString(); 
} 
+0

Ne devrais-je pas être en mesure d'accéder dans les arguments d'événement? –

+0

Votre assertion est correcte, la collection GridViewDeletedEventArgs.Keys est remplie uniquement lors de l'utilisation d'un DataSourceID. – Phaedrus

+0

Il s'agit d'une solution de contournement au problème que la collection GridViewDeletedEventArks.Keys n'est pas remplie. Sommes-nous simplement en train de renoncer à avoir cette population? –

0

ajouter

<asp:BoundField DataField="ID" /> 

et voir si le champ a même une valeur.

+0

J'ai vérifié cela. Cela a une valeur. –