2

GridViewフッターでユーザーがEnterキーを押すと、行が挿入されるように実装する機能があります。GridViewには2<asp:ImageButton><EmptyDataTemplate>あり、もう1つ<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

insertByEnterKey()関数の後に return false を追加するだけで解決します

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

さらに良い解決策:

ユーザーが「Enter キー」を押したときに 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 に答える
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 に答える