2

我有实现的功能,即当用户在 GridView 页脚并按 Enter 键时,将插入该行。在 GridView 中,我有 2<asp:ImageButton>个,<EmptyDataTemplate>另一个在<FooterTemplate>我编写 JavaScript 以在最后一个字段中使用时执行 ImageButton Click 事件,ImageButton Server-Side Click 事件被触发但页面未更新。

这是JavaScrip函数:

 function insertByEnterKey(buttonId) {
        var button = document.getElementById(buttonId);
        var keyEvent = event.keyCode;

        if (keyEvent == 13) {
            button.click();

        }
    }

这是 ASPX:

<asp:UpdatePanel ID="UpdatePanel" runat="server">
        <ContentTemplate>
            ...
            <asp:GridView ID="grvDonationDist" runat="server" AutoGenerateColumns="False" ShowFooter="True"
                DataKeyNames="reciept_num,donation_code" meta:resourcekey="grvDonationDistResource1"
                ShowHeaderWhenEmpty="True" BorderWidth="1px" BackColor="White" BorderColor="LightSteelBlue"
                CellPadding="0" Font-Name="tahoma" Font-Size="10pt" ForeColor="DarkBlue" HeaderStyle-BackColor="#aaaadd"
                GridLines="None">
                <EmptyDataTemplate>
                    <asp:Label CssClass="label" ID="lblEmptyDonationDist" runat="server" Text="No Donations"
                        meta:resourcekey="lblEmptyDonationDistResource1"></asp:Label>
                    <tr>
                        <td>
                            <asp:ImageButton ID="lbtnAdd" runat="server" OnClick="lbtnAdd_Click" meta:resourcekey="AddResource1"
                                ImageUrl="Content/images/add.png"></asp:ImageButton>
                        </td>
                        ...
                        <td>
                            <asp:TextBox ID="txtDonationNotesFooter" CssClass="textbox" runat="server" meta:resourcekey="txtDonationNotesResource1"
                                onKeyDown="insertByEnterKey('lbtnAdd');"></asp:TextBox>
                        </td>
                    </tr>
                </EmptyDataTemplate>
                <Columns>
                    <asp:TemplateField FooterText="Total" ShowHeader="False">
                        <EditItemTemplate>
                          ...
                        </EditItemTemplate>
                        <ItemTemplate>
                            ...
                        </ItemTemplate>
                        <FooterTemplate>
                            <asp:ImageButton ID="lbtnAdd" runat="server" OnClick="lbtnAddFromFooter_Click" meta:resourcekey="AddResource1"
                                ImageUrl="Content/images/add.png"></asp:ImageButton>
                        </FooterTemplate>
                    </asp:TemplateField>
                  ...
                    <asp:TemplateField HeaderText="Notes" SortExpression="distribution_remrks" meta:resourcekey="TemplateFieldResource3">
                        <EditItemTemplate>
                            ...
                        </EditItemTemplate>
                        <ItemTemplate>
                           ...
                        </ItemTemplate>
                        <FooterTemplate>
                            <asp:TextBox ID="txtDonationNotesFooter" CssClass="textbox" runat="server" meta:resourcekey="txtDonationNotesResource1"
                                onKeyDown="insertByEnterKey('lbtnAdd');"></asp:TextBox>
                        </FooterTemplate>
                    </asp:TemplateField>                  
                </Columns>
            </asp:GridView>
      </ContentTemplate>
</asp:UpdatePanel>

这是 VB.NET:

Protected Sub lbtnAddFromFooter_Click(sender As Object, e As EventArgs)
    'Footer Add
    'Add Insert Logic here
    Try

        Dim donationDist As New DonationDist

        Dim txtDonationValueFooter As TextBox = grvDonationDist.FooterRow.FindControl("txtDonationValueFooter")
        Dim txtDonationNotesFooter As TextBox = grvDonationDist.FooterRow.FindControl("txtDonationNotesFooter")
        Dim ddlCountryFooter As DropDownList = grvDonationDist.FooterRow.FindControl("ddlCountryFooter")
        Dim ddlPurposeFooter As DropDownList = grvDonationDist.FooterRow.FindControl("ddlNewDonationPurposeType")
        Dim chkPartial As CheckBox = grvDonationDist.FooterRow.FindControl("chkPartialFooter")
        Dim standInstruct As Label = grvDonationDist.FooterRow.FindControl("lblStandInstructFooter")
        Dim donationValue As Decimal = Convert.ToDecimal(txtDonationValueFooter.Text)

        'Validation: Donation Value must be > 0
        If (donationValue <= 0) Then

            If (CultureInfo.CurrentUICulture.Name.Contains("ar")) Then

                ShowAlert("قيمة الترع يجب ان تكون أكبر من الصفر")

            ElseIf (CultureInfo.CurrentUICulture.Name.Contains("en")) Then

                ShowAlert("Donation Value must be greater than 0")

            End If

            Exit Sub

        End If

        myDonationDistDataTable = Session("myDonationDistDataTable")

        'Validation: Only one donation type per Receipt
        For Each row As DataRow In myDonationDistDataTable.Rows

            If (row.Item("donation_code") = ddlPurposeFooter.SelectedValue) Then

                If (CultureInfo.CurrentUICulture.Name.Contains("ar")) Then

                    ShowAlert("لا يمكن تكرار الغرض في نفس سند القبض")

                ElseIf (CultureInfo.CurrentUICulture.Name.Contains("en")) Then

                    ShowAlert("You cannot add more than on Donation Type per receipt")

                End If

                Exit Sub
            End If

        Next



        myDonationDistDataRow = myDonationDistDataTable.NewRow()
        myDonationDistDataRow("reciept_num") = 0
        myDonationDistDataRow("donation_code") = Convert.ToInt16(ddlPurposeFooter.SelectedValue)
        myDonationDistDataRow("donation_name") = ddlPurposeFooter.SelectedItem.Text
        myDonationDistDataRow("donation_value") = Convert.ToDecimal(txtDonationValueFooter.Text)
        myDonationDistDataRow("country_code") = Convert.ToInt16(ddlCountryFooter.SelectedValue)
        myDonationDistDataRow("country_name") = ddlCountryFooter.SelectedItem.Text
        myDonationDistDataRow("distribution_remrks") = txtDonationNotesFooter.Text
        myDonationDistDataRow("partial") = chkPartial.Checked
        myDonationDistDataRow("standing_inst_num") = If(String.IsNullOrWhiteSpace(standInstruct.Text), 0, Convert.ToInt32(standInstruct.Text))

        'add the new DataRow to DataTable's Row
        myDonationDistDataTable.Rows.Add(myDonationDistDataRow)

        Session("myDonationDistDataTable") = myDonationDistDataTable

        grvDonationDist.DataSource = myDonationDistDataTable
        grvDonationDist.DataBind()

    Catch ex As Exception
         'TODO: Log the exception
    End Try
End Sub

这段代码有什么问题?我错过了什么吗?

4

2 回答 2

0

你不能那样做,你需要将事件添加到更新面板
javascript:

    function insertByEnterKey(buttonId) {
        var button = document.getElementById(buttonId);
        var keyEvent = event.keyCode;

        if (keyEvent == 13) {
            __doPostBack('<%= UpdatePanel.UniqueId %>', '');
        }
    }

aspx:

<asp:UpdatePanel ID="UpdatePanel" runat="server" UpdateMode="Conditional" onload="UpdatePanel_Load">
    <ContentTemplate>

    </ContentTemplate>
</asp:UpdatePanel>

CS:

protected void UpdatePanel_Load(object sender, EventArgs e)
    {
        //add your code here
    }

如果您的代码中没有 _doPostBack,您可以像这样添加它..

protected void Page_Load(object sender, EventArgs e)
    {
        ClientScript.GetPostBackEventReference(this, string.Empty);
    }
于 2012-10-14T14:25:37.387 回答
0

我只是通过在insertByEnterKey()函数后添加 return false 来解决它

onKeyDown="insertByEnterKey('lbtnAdd'); return false;"

更好的解决方案:

当用户按下“Enter Key”时,使 JavaScript 函数返回 False,否则返回 True。

function insertByEnterKey(buttonId) {
            var button = document.getElementById(buttonId);
            var keyEvent = event.keyCode;

            if (keyEvent == 13) {
                button.click();
                return false;
            } else {
                return true;
            }
        }

并像这样在文本框中使用它:

<asp:TextBox ID="txtDonationNotesFooter" runat="server" onKeyDown="return insertByEnterKey('lbtnAdd');"></asp:TextBox>
于 2012-10-17T07:13:43.987 回答