Почему DataItem null для строки GridView "null" при попытке сохранить изменения?
Итак, у меня этот GridView на моей веб-странице. Это бит данных, поэтому во время события RowDataBound этот код работает отлично:
protected void myGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TimecardApproval shift = (TimecardApproval)e.Row.DataItem;
}
}
Переменная "shift" имеет все необходимые мне данные, отлично работает. Но тогда есть этот код для сохранения данных:
protected void btnSubmitApprovals_Click(object sender, ImageClickEventArgs e)
{
foreach (GridViewRow item in gvTimeCards.Rows)
{
TimecardApproval shift = (TimecardApproval)item.DataItem;
// code to update the row
}
}
DataItem имеет значение null! Зачем? Так как поле есть, кажется странным, что оно равно нулю. Должен ли я перебирать что-то еще?
Ответы
Ответ 1
Я понимаю, что вы можете иметь intellisense, литая DataItem TimeCardApproval. Вы можете сделать это вместо этого. Используйте DataKeyNames для хранения Первичного ключа каждой строки, которая должна быть TimecardApprovalID
, а в вашем коде доступа к первичному ключу и использовать его для получения исходного элемента
foreach (GridViewRow item in gvTimeCards.Rows)
{
//get the ID of the TimeApproval for each row
string id = gvDocs.DataKeys[item.RowIndex].Value.ToString();
//string id = ((HiddenField) item.FindControl("IDHiddenField")).Value;
//string id = item.Cells[0].Text;
//use the ID or get TimeCardApproval object from DB
TimecardApproval shift = MyDB.GetTimeCardApproval(id);
}
Установка клавиш
<asp:GridView ID="gvTimeCards" DataKeyNames="TimecardApprovalID">
</asp:GridView>
Ответ 2
Возможно, это поможет вам
Столбец сетки:
<asp:TemplateField HeaderText="Item ID">
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Id") %>'/>
<asp:HiddenField runat="server" ID="hfDataItem" Value='<%# JsonConvert.SerializeObject(Container.DataItem) %>'/>
</ItemTemplate></asp:TemplateField>
Код позади:
protected void btApply_OnClick(object sender, EventArgs e)
{
var rows = (from GridViewRow row in gvResult.Rows
where row.RowType == DataControlRowType.DataRow
let dataItem = (HiddenField) row.FindControl("hfDataItem")
select JsonConvert.DeserializeObject<ResultGridRowItem>(dataItem.Value));
}
Ответ 3
Событие привязки gridview срабатывает перед нажатием кнопки. Звучит странно, но жизненный цикл страницы asp.net сумасшествие.
Попробуйте использовать свой код в событии gridview RowUpdating
или RowUpdated
.