GridView进入UpdatePanel触发OnRowUpdating事件:但我只能看到ItemTemplate内的控

本文关键字:ItemTemplate 触发 UpdatePanel 进入 OnRowUpdating 事件 GridView | 更新日期: 2023-09-27 17:50:47

正如我在标题中所写的那样,这个问题很有趣:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
        <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id_Newsletter" HeaderStyle-BackColor="Black" 
                    HeaderStyle-ForeColor="White" RowStyle-BackColor="DarkGray" AlternatingRowStyle-BackColor="LightGray" PageSize="6" AllowPaging="true"
                    AllowSorting="true" ShowHeaderWhenEmpty="true" EmptyDataText="La tabella non contiene dati" EnableViewState="true" RowStyle-Wrap="true"
                    PagerStyle-HorizontalAlign="Left" PagerStyle-BorderWidth="0" BorderWidth="0" OnRowCommand="GridView_RowCommand"
                    OnRowCancelingEdit="GridView_RowCancelingEdit" OnRowUpdating="GridView_RowUpdating" OnRowDeleting="GridView_RowDeleting"
                    OnPageIndexChanging="GridView_PageIndexChanging" OnSorting="GridView_Sorting" OnRowEditing="GridView_RowEditing" CssClass="NewsletterManager_GridView" >
        <Columns>
        <asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderText="Indirizzo Email" HeaderStyle-Width="275" SortExpression="emailNewsletter">
        <ItemTemplate>
            <asp:Label ID="lbl_emailNewsletter" runat="server" Text='<%# Eval("emailNewsletter") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:Label ID="lbl_emailNewsletter" runat="server" Text='<%# Eval("emailNewsletter") %>' Visible="false" ></asp:Label>
            <asp:TextBox ID="txt_emailNewsletter" runat="server" Text='<%# Bind("emailNewsletter") %>'></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderText="Azioni" HeaderStyle-Width="100">
        <EditItemTemplate>
            <asp:ImageButton ID="Img_Aggiorna" runat="server" CommandName="Update" ImageUrl="~/images/GridIcon/update.png" ToolTip="Aggiorna" />&nbsp;&nbsp;
            <asp:ImageButton ID="Img_Annulla" runat="server" CommandName="Cancel" ImageUrl="~/images/GridIcon/undo.png" ToolTip="Annulla" />
        </EditItemTemplate>
        <ItemTemplate>
            <asp:ImageButton ID="Img_Modifica" runat="server" CommandName="Edit" ImageUrl="~/images/GridIcon/edit.png" ToolTip="Modifica" />&nbsp;&nbsp;
            <asp:ImageButton ID="Img_Cancella" runat="server" CommandName="Delete" ImageUrl="~/images/GridIcon/delete.png" OnClientClick="return confirm('Sei sicuro di voler cancellare l''email?');" ToolTip="cancella" />
            </ItemTemplate>
        </asp:TemplateField>

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
        LoadGridView(GridView1, -1, 0);
    lbl_result.Text = String.Empty;
}
protected void GridView_RowEditing(Object sender, GridViewEditEventArgs e)
{
    LoadGridView(((GridView)sender), e.NewEditIndex, ((GridView)sender).PageIndex);
}
protected void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    NewsLetterBL newsBl = new NewsLetterBL();
    String oldmail = ((Label)((GridView)sender).Rows[e.RowIndex].FindControl("lbl_emailNewsletter")).Text;
    String newmail = ((TextBox)((GridView)sender).Rows[e.RowIndex].FindControl("txt_emailNewsletter")).Text;
    if (newsBl.ModifyWrongEmail(oldmail, newmail))
        lbl_result.Text = "Modify Done";
    else lbl_result.Text = newsBl.LastMessage;
    LoadGridView(((GridView)sender), -1, ((GridView)sender).PageIndex);
}
protected void LoadGridView(GridView GV, int EditIndex, int PageIndex)
{
    NewsLetterBL newsBl = new NewsLetterBL();
    DataView dw = new DataView(newsBl.getFullNewsletter());
    String SortExpression = GV.ID.ToString() + "_SortExpression";
    if (ViewState[SortExpression] != null) dw.Sort = (String)ViewState[SortExpression];
    GV.DataSource = dw;
    GV.PageIndex = PageIndex;
    GV.EditIndex = EditIndex;
    GV.DataBind();
}

当我试图从处理GridView1OnRowUpdating事件的GridView_RowUpdating访问txt_emailNewsletter控件到编辑模式下的行时,元素抛出NullReferenceException,但可以创建lbl_emailNewsletter控件。

标签到ItemTemplate和EditItemTemplate有相同的ID (lbl_emailNewsletter):如果我改变标签到ItemTemplate的ID,字符串oldmail和newmail抛出null引用异常;显然,问题是,当我点击ImageButton Img_AggiornaCommandName="Update", ASP。

GridView进入UpdatePanel触发OnRowUpdating事件:但我只能看到ItemTemplate内的控

从编辑行中只查找ItemTemplate控件而不是EditItemTemplate控件。

GridView事件"OnRowUpdating"只有在使用数据源时才有用:在这种情况下,可以访问字典e.o oldvalues[]或e.o ewvalues[]并正确获取旧值和新值。

我已经解决了问题,使用事件"OnRowCommand"与个性化的CommandName和CommandArgument与旧值:在这种情况下,可以访问GridView中编辑行的所有控件与新值。

<asp:ImageButton ID="Img_Update" runat="server" CommandName="Change" CommandArgument='<%# Eval("emailNewsletter") %>' ImageUrl="~/images/GridIcon/update.png" ToolTip="Update" />

protected void GridView_RowCommand(Object sender, GridViewCommandEventArgs e)
{
    switch (e.CommandName)
    {
        case "Change":
            ImageButton btnNew = e.CommandSource as ImageButton;
            GridViewRow row = btnNew.NamingContainer as GridViewRow;
            TextBox txt_emailNewsletter = row.FindControl("txt_emailNewsletter") as TextBox;
            if ( !CheckEmail(e.CommandArgument.ToString()) || !CheckEmail(txt_emailNewsletter.Text) )
                lbl_result.Text = "ERROR : Email not Valid";
            else {
                if (txt_emailNewsletter.Text.Trim().ToLower() == e.CommandArgument.ToString())
                    lbl_result.Text = "Email values are indentical";
                else
                {
                    //Business Layer Call
                    NewsLetterBL newsBl2 = new NewsLetterBL();
                    if (newsBl2.ModifyWrongEmail(e.CommandArgument.ToString(), txt_emailNewsletter.Text.Trim().ToLower()))
                        lbl_result.Text = "Email Changed";
                    else
                        lbl_result.Text = "ERROR : " + newsBl2.LastMessage;
                }
            }
            LoadDataForGridView(((GridView)sender));
            BindGridView(((GridView)sender), -1, ((GridView)sender).PageIndex);
            break;
    }
}