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