GridView в UpdatePanel запускает событие OnRowUpdating: но я вижу только элементы управления внутри ItemTemplate вместо EditItemTemplate?

Как я написал в заголовке, проблема очень забавная:

<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();
}

Когда я пытаюсь получить доступ к элементу управления txt_emailNewsletter в строке в режиме редактирования из элемента GridView_RowUpdating, обрабатывающего событие OnRowUpdating элемента GridView1, элемент выдает NullReferenceException, но элемент управления lbl_emailNewsletter может быть найден.

Ярлыки в ItemTemplate и EditItemTemplate имеют один и тот же идентификатор (lbl_emailNewsletter): если я изменяю идентификатор метки в ItemTemplate, как String oldmail, так и newmail выдают исключение null Reference ; очевидно, проблема в том, что когда я нажимаю ImageButton Img_Aggiorna с CommandName="Update", ASP.NET по загадочной причине находит только элементы управления ItemTemplate вместо EditItemTemplate из редактируемой строки.


person user1949688    schedule 04.01.2013    source источник
comment
Это ваш исходный код? кажется, у вас нет шаблона контента на панели обновлений?   -  person Alex Z    schedule 05.01.2013
comment
@Alex_Z Тег шаблона контента теперь размещен в правильном месте ... Ошибка, когда я включил частичный код!   -  person user1949688    schedule 05.01.2013


Ответы (1)


Событие GridView "OnRowUpdating" полезно, только если вы используете источник данных: в этом случае можно получить доступ к словарю e.OldValues[] или e.NewValues[] и правильно получить старые и новые значения.

Я решил проблему, используя событие «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;
    }
}
person user1949688    schedule 21.01.2013