2009-02-24 3 views
4

У меня есть GridView так же, как это:ASP.NET - Нет Datakey на мероприятии 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> 

Вот как я создаю мой DataTable, которую GridView привязан к, так что вы знаете, что данные, которые я имею дело с:

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

Почему, а почему нет ключей, переданных в EventArgs события RowDeleting? Мне нужно удалить запись из DataTable ADO.NET, которую я сохраняю в состоянии сеанса, когда это событие запущено.

Почему это не работает? Разве DataKeys работает только при использовании элемента управления DataSource?

+0

Я думаю, вы должны добавить «Databinding» метки на этот вопрос. BTW, я стучал головой по той же проблеме. –

+0

Как вы добавляете студентов в свой стол? Заполняются ли данные в вашей таблице до того, как вызывается метод удаления (т. Е. В Page_Load)? – cjk

ответ

8

Это работает:

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

Должен ли я иметь возможность доступа в случае args? –

+0

Ваше утверждение верное, коллекция GridViewDeletedEventArgs.Keys заполняется только при использовании DataSourceID. – Phaedrus

+0

Обходной путь к проблеме, что коллекция GridViewDeletedEventArks.Keys не заполняется. Мы просто отказываемся от того, чтобы этот населенный пункт был заполнен? –

0

добавить

<asp:BoundField DataField="ID" /> 

и посмотреть, если поле даже имеет значение.

+0

Я проверил это. Он имеет значение. –

Смежные вопросы