NewValues и OldValues GridView в пустой в случае OnRowUpdating
У меня есть GridView ниже. Я привязываюсь к пользовательскому источнику данных в коде позади. Он попадает в событие "OnRowUpdating" просто отлично, но нет никаких NewValues или OldValues. Любые предложения о том, как я могу получить эти значения?
<asp:GridView ID="gv_Personnel"
runat="server"
OnRowDataBound="gv_Personnel_DataBind"
OnRowCancelingEdit="gv_Personnel_CancelEdit"
OnRowEditing="gv_Personnel_EditRow"
OnRowUpdating="gv_Personnel_UpdateRow"
AutoGenerateColumns="false"
ShowFooter="true"
DataKeyNames="BudgetLineID"
AutoGenerateEditButton="true"
AutoGenerateDeleteButton="true"
>
<Columns>
<asp:BoundField HeaderText="Level of Staff" DataField="LineDescription" />
<%--<asp:BoundField HeaderText="Hrs/Units requested" DataField="NumberOfUnits" />--%>
<asp:TemplateField HeaderText="Hrs/Units requested">
<ItemTemplate>
<%# Eval("NumberOfUnits")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="tb_NumUnits" runat="server" Text='<%# Bind("NumberOfUnits")%>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Hrs/Units of Applicant Cost Share" DataField="" NullDisplayText="0" />
<asp:BoundField HeaderText="Hrs/Units of Partner Cost Share" DataField="" NullDisplayText="0" />
<asp:BoundField FooterStyle-Font-Bold="true" FooterText="TOTAL PERSONNEL SERVICES:" HeaderText="Rate" DataFormatString="{0:C}" DataField="UnitPrice" />
<asp:TemplateField HeaderText="Amount Requested" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
<asp:TemplateField HeaderText="Applicant Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
<asp:TemplateField HeaderText="Partner Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
<asp:TemplateField HeaderText="Total Projet Cost" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
</Columns>
</asp:GridView>
5 ответов
относительно элемента управления GridView Проблема события RowUpdating, это ожидаемое поведение, потому что когда мы делаем не связывать GridView(или другое ASP.NET управления с привязкой к данным 2.0) с Контроль dataSource это не автоматически запросите и заполните коллекция параметров обновление/удаление/... события. В таких случаи, нам нужно вручную извлечь значения полей из шаблона управление.
это то, что говорит сотрудник Microsoft в здесь.
в этом случае вы можете сделать это с помощью ExtractValuesFromCell метод, чтобы сделать коллекцию NewValues самостоятельно.
EDIT:
Я нашел фрагмент кода в комментариях этой блог:
protected void OnRowEditing(object sender, GridViewEditEventArgs e)
{
GridView gv = (GridView)sender;
gv.EditIndex = e.NewEditIndex;
gv.DataBind();
...
}
protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridView gv = (GridView)sender;
for (int i = 0; i < gv.Columns.Count; i++)
{
DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell;
gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true);
}
// now you can use NewValues collection normally
}
Havent протестировал его, но, похоже, решил проблему, дайте мне знать, если это так.
Я не уверен, что это поможет..но это то, что я нашел в msdn сайт
коллекции Keys, OldValues и NewValues автоматически заполняются только тогда, когда элемент управления GridView привязан к данным с помощью свойства DataSourceID.
Я делал привязку данных в моем событии Page_Load, и когда я нажал "обновить", обратная передача была сделана, так что событие Page_Load было запущено. GridView снова был заполнен старыми значениями, поэтому в myGrid.Событие RowUpdating я не смог получить новые значения. Если это поможет
Bind в обработчике событий PreRender страницы следующим образом:
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
GridBinder()
End Sub
NB: PreRender происходит после события RowUpdating.
вам нужно проверить IsPostback в загрузке формы. Когда обновление gridview сделало обратную передачу, оно сначала обновилось со старыми значениями. Использовать IsPostback для предотвращения этого:
If Not IsPostback Then
' Data bind here
End If
таким образом, он не будет перезаписывать "новые" значения gridview