0

私はすでにこの問題を解決するために2日間費やしていますが、これを解決する方法については運がありません. データベースからのデータを表示する GridView があり、変更および削除する機能もあります。これは、私の GridView の現在の ASP コードです。

<asp:GridView ID="dgvSortKey" runat="server" AllowSorting="True" OnRowDataBound="gv_drb"
                AutoGenerateColumns="False" AllowPaging="True" BackColor="White" BorderColor="#336666"
                BorderStyle="Double" BorderWidth="3px" CellPadding="4" GridLines="Horizontal"
                Height="73px" AutoGenerateEditButton="True" OnRowEditing="dgvSortKey_RowEditing"
                OnRowUpdating="dgvSortKey_RowUpdating" OnRowCancelingEdit="dgvSortKey_RowCancelingEdit"
                OnSelectedIndexChanging="dgvSortKey_SelectedIndexChanging" OnPageIndexChanged="dgvSortKey_PageIndexChanged"
                OnPageIndexChanging="dgvSortKey_PageIndexChanging" OnRowCommand="dgvSortKey_RowCommand"
                OnRowDeleted="dgvSortKey_RowDeleted" OnRowUpdated="dgvSortKey_RowUpdated" Width="561px"
                PageSize="15" DataKeyNames="KeyCode,KeyDescription">
                <FooterStyle BackColor="White" ForeColor="#333333" />
                <RowStyle BackColor="White" ForeColor="#333333" />
                <PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />
                <SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" HorizontalAlign="Center" />
                <AlternatingRowStyle BackColor="LightCyan" />
                <Columns>
                    <asp:TemplateField HeaderText="">
                        <ItemTemplate>
                            <asp:LinkButton ID="lnkdelete" runat="server" OnClick="lnkdelete_Click">Delete</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Instruction Key Code">
                        <ItemTemplate>
                            <asp:Label ID="lblValKeyCode" runat="server" Text='<%#System.Web.HttpUtility.HtmlEncode((string)Eval("KeyCode")) %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox ID="txtValKeyCode" runat="server" Text='<%#Bind("KeyCode") %>' MaxLength="10"
                                CausesValidation="false"></asp:TextBox>
                        </EditItemTemplate>
                        <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" CssClass="GvBorderGreen" />
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Description">
                        <ItemTemplate>
                            <asp:Label ID="lblValKeyDescription" runat="server" Text='<%#System.Web.HttpUtility.HtmlEncode((string)Eval("KeyDescription")) %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox ID="txtValKeyDescription" runat="server" Text='<%#Bind("KeyDescription") %>'
                                Width="300" MaxLength="20" CausesValidation="false"></asp:TextBox>
                        </EditItemTemplate>
                        <ItemStyle CssClass="GvBorderGreen" />
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

問題は、[更新] ボタンをクリックした後、特定のレコードを更新できないことです。下の画像を参照してください。

ここに画像の説明を入力

デバッグ モードでは、OnRowUpdating イベントを渡さず、代わりに OnRowEditing に渡します。驚いたことの 1 つは、OnRowCommand を起動すると、更新ボタンがクリックされたときに CommandName が"Edit"に設定されることです。以下の画像をご覧ください。

ここに画像の説明を入力

ところで、これはコード ビハインドです。

protected void dgvSortKey_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //Currently Unreachable code due to unknown reason. RowUpdating not trigger even clicking Update Button in the GridView
        // this.dvDetialContent.Visible = true;
        List<SqlDbParameter> list = new List<SqlDbParameter>();

        TextBox txtValKeyDescription = dgvSortKey.Rows[e.RowIndex].FindControl("txtValKeyDescription") as TextBox;
        TextBox txtValKeyCode = dgvSortKey.Rows[e.RowIndex].FindControl("txtValKeyCode") as TextBox;

        if (string.IsNullOrEmpty(txtValKeyCode.Text) || string.IsNullOrEmpty(txtValKeyDescription.Text))
        {
            string alert = "alert('Instruction KeyCode or KeyDecription should not be empty');";
            ScriptManager.RegisterStartupScript(this, this.GetType(), "scripting", alert, true);
        }
        else
        {
            //Trace.Write("txtKeyCode", HttpUtility.HtmlDecode(txtKeyCode.Text));
            //Trace.Write("txtKeyDescription", txtKeyDescription.Text);
            //Trace.Write("txtValKeyCode", txtValKeyCode.Text);
            //Trace.Write("txtValKeyDescription", txtValKeyDescription.Text);
            list.Add(new SqlDbParameter("@oldcode", HttpUtility.HtmlDecode(txtKeyCode.Text)));
            list.Add(new SqlDbParameter("@oldname", HttpUtility.HtmlDecode(txtKeyDescription.Text)));
            list.Add(new SqlDbParameter("@newcode", HttpUtility.HtmlDecode(txtValKeyCode.Text)));
            list.Add(new SqlDbParameter("@newname", HttpUtility.HtmlDecode(txtValKeyDescription.Text)));
            try
            {
                int result = CoreUtility.ExecuteNonQuery("update InstructionKey set KeyCode=@newcode, KeyDescription=@newname where KeyCode = @oldcode and KeyDescription = @oldname", list);
                //Trace.Write("ResultValue", result.ToString());
            }
            catch (Exception ex)
            {
                string alert = "alert('Instruction KeyCode should not be duplicate');";
                ScriptManager.RegisterStartupScript(this, this.GetType(), "scripting2", alert, true);
            }
        }

        dgvSortKey.EditIndex = -1;
        imgbtnFilter_Click(null, null);

        this.txtKeyCode.Text = "";
        this.txtKeyDescription.Text = "";

    }
    protected void dgvSortKey_RowEditing(object sender, GridViewEditEventArgs e)
    {
        // this.dvDetialContent.Visible = true;
        //if (ViewState["updateFlag"] == null)
        //{
            //ViewState["editFlag"] = "forEdit";
            //ViewState["editIndex"] = e.NewEditIndex;
            dgvSortKey.EditIndex = e.NewEditIndex;
            Label lblValKeyDescription = dgvSortKey.Rows[e.NewEditIndex].FindControl("lblValKeyDescription") as Label;
            Label lblValKeyCode = dgvSortKey.Rows[e.NewEditIndex].FindControl("lblValKeyCode") as Label;
            this.txtKeyCode.Text = lblValKeyCode.Text;
            this.txtKeyDescription.Text = lblValKeyDescription.Text;
            imgbtnFilter_Click(null, null);
        //}
        //else
        //{
            //RowUpdate((int)ViewState["editIndex"]);
            //ViewState.Remove("updateFlag");
            //ViewState.Remove("editFlag");
            //ViewState.Remove("editIndex");
        //}
    }
    protected void dgvSortKey_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        dgvSortKey.EditIndex = -1;
        imgbtnFilter_Click(null, null);
    }
    protected void dgvSortKey_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        this.dvDetialContent.Visible = true;
        Label lblValKeyDescription = dgvSortKey.Rows[e.NewSelectedIndex].FindControl("lblValKeyDescription") as Label;
        Label lblValKeyCode = dgvSortKey.Rows[e.NewSelectedIndex].FindControl("lblValKeyCode") as Label;

        this.txtKeyCode.Text = lblValKeyCode.Text;
        this.txtKeyDescription.Text = lblValKeyDescription.Text;
    }
    protected void dgvSortKey_PageIndexChanged(object sender, EventArgs e)
    {

    }
    protected void dgvSortKey_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        dgvSortKey.PageIndex = e.NewPageIndex;
        imgbtnFilter_Click(null, null);
    }
    protected void dgvSortKey_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {

    }
    protected void dgvSortKey_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        String jsScript = "";
        jsScript += "var answer=confirm('Delete this Instruction Key?');\n";
        jsScript += "if (!answer){\n";
        jsScript += " document.getElementById('ctl00_cthContent_hdDelete').Value = 'DELETE';\n";
        jsScript += "}\n";

        //return;
        ScriptManager.RegisterStartupScript(this, this.GetType(), "script", jsScript, true);

        List<SqlDbParameter> list = new List<SqlDbParameter>();

        Label lblValKeyCode = dgvSortKey.Rows[e.RowIndex].FindControl("lblValKeyCode") as Label;
        Label lblValKeyDescription = dgvSortKey.Rows[e.RowIndex].FindControl("lblValKeyDescription") as Label;
        list.Add(new SqlDbParameter("@code", lblValKeyCode.Text));
        list.Add(new SqlDbParameter("@name", lblValKeyDescription.Text));

        CoreUtility.ExecuteNonQuery("DELETE FROM [InstructionKey] WHERE KeyCode=@code and KeyDescription=@name;", list);
        Initial();
        this.dvDetialContent.Visible = false;
        dgvSortKey.EditIndex = -1;
        imgbtnFilter_Click(null, null);
    }
    protected void dgvSortKey_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        string id = e.CommandName;
    }
    protected void dgvSortKey_RowDeleted(object sender, GridViewDeletedEventArgs e)
    {

    }
    protected void gv_drb(object sender, GridViewRowEventArgs e)// 
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            LinkButton lnkbtnresult = (LinkButton)e.Row.FindControl("lnkdelete");
            //raising javascript confirmationbox whenver user clicks on link button
            lnkbtnresult.Attributes.Add("onclick", "javascript:return ConfirmationBox()");
        }
    }
4

1 に答える 1

1

私はバグを理解していませんが、試してみたい回避策があります。
自動生成された編集ボタンは問題を引き起こしているので、自分で生成してみませんか?

このような:

<asp:TemplateField HeaderText="">
    <ItemTemplate>
        <asp:LinkButton ID="lnkedit" runat="server" CommandName="Edit">Edit</asp:LinkButton>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:LinkButton ID="lnkedit" runat="server" CommandName="Update">Update</asp:LinkButton>
        <asp:LinkButton ID="lnkedit" runat="server" CommandName="Cancel">Cancel</asp:LinkButton>
    </EditItemTemplate> 
</asp:TemplateField>

そして、コードビハインドでそれを処理します:

  void dgvSortKey_RowCommand(Object sender, GridViewCommandEventArgs e)
  {
    // If multiple buttons are used in a GridView control, use the
    // CommandName property to determine which button was clicked.
    if(e.CommandName=="Update")
    {

    }
  }
于 2012-08-30T03:54:15.917 に答える