views:

4562

answers:

2

I have a GridView just like this:

<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>

Here is how I am creating my DataTable, which the GridView is bound to, so that you know what data I am dealing with:

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;
}

Why, oh, why are there no keys passed in the EventArgs of the RowDeleting event? I need to remove the record from the ADO.NET DataTable that I am keeping in session state when this event is fired.

Why isn't this working? Is it that DataKeys only work when using a DataSource control?

A: 

add

<asp:BoundField DataField="ID" />

and see if the field even has a value.

Al W
I have checked this. It does have a value.
Ronnie Overby
+3  A: 

This works:

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();   
}
Phaedrus
Shouldn't I be able to access in the event args?
Ronnie Overby
Your assertion is correct, GridViewDeletedEventArgs.Keys collection is only populated when using a DataSourceID.
Phaedrus
This is a workaround to the problem that GridViewDeletedEventArks.Keys collection isn't populated.Are we just giving up on ever having this populated?
Andrew Shepherd