0

タイトルに書いたように、この問題はとても面白いです:

<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_RowUpdatingOnRowUpdatingGridView1NullReferenceExceptionlbl_emailNewsletter

ItemTemplate と EditItemTemplate のラベルには同じ ID ( lbl_emailNewsletter) があります。ラベルの ID を ItemTemplate に変更すると、String oldmail と newmail の両方が null Reference の例外をスローします。明らかに問題は、不思議な理由で ASP.NET で ImageButton をクリックするImg_AggiornaCommandName="Update"、編集された行から EditItemTemplate ではなく ItemTemplate のコントロールのみを検索することです。

4

1 に答える 1

0

GridView イベント "OnRowUpdating" は、データソースを使用する場合にのみ役立ちます。この場合、ディクショナリ e.OldValues[] または e.NewValues[] にアクセスして、古い値と新しい値を正しく取得できます。

パーソナライズされた CommandName と古い値を持つ CommandArgument を持つイベント "OnRowCommand" を使用して問題を解決しました。この場合、新しい値を持つ 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;
    }
}
于 2013-01-21T19:32:11.630 に答える