NewValues ​​и OldValues ​​GridView пустые в событии OnRowUpdating - PullRequest
9 голосов
/ 12 марта 2010

У меня есть 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 ]

5 голосов
/ 12 марта 2010

Я не уверен, поможет ли это ... но это то, что я нашел в MSDN site

Коллекции Keys, OldValues ​​и NewValues ​​автоматически заполняются, только когда элемент управления GridView привязан к данным с помощью свойства DataSourceID.

4 голосов
/ 12 марта 2010

Относительно элемента управления GridView Проблема события RowUpdating, это ожидаемое поведение, потому что, когда мы делаем не ассоциировать GridView (или другой ASP.NET 2.0 управления данными) с Контроль источника данных, это не будет автоматически запрашивать и заполнять Коллекция параметров обновление / удаление / ... событий. В таком случаи, нам нужно вручную извлечь значения полей из шаблона управление.

Это то, что говорит сотрудник 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
}

Не проверял, но, кажется, решил проблему, дайте мне знать, если это было.

2 голосов
/ 08 декабря 2011

Я делал привязку данных в своем событии Page_Load, и когда я нажал «Обновить», PostBack был завершен, так же было запущено событие Page_Load. GridView снова заполнился старыми значениями, поэтому в событии myGrid.RowUpdating я не смог получить новые значения. Если это поможет

1 голос
/ 17 апреля 2013

Привязка в обработчике событий PreRender страницы выглядит следующим образом:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    GridBinder()
End Sub

Примечание: PreRender происходит после события RowUpdating.

0 голосов
/ 12 февраля 2012

Вам необходимо проверить IsPostback в форме загрузки. Когда обновление gridview выполняло обратную передачу, оно сначала обновлялось старыми значениями. Используйте IsPostback, чтобы предотвратить это:

If Not IsPostback Then 

   ' Data bind here

End If

Таким образом, он не будет перезаписывать «новые» значения gridview

...