2

Ajax UpdatePanel 内に Gridview があります。各 GV 行内に、チェックボックス フィールドがあります。アイデアは、ユーザーが必要な行をチェックし、ボタンをクリックしてその行のラベルを「出荷済み」として更新し、チェックされた行をxlsファイル(実際にはcsv)にエクスポートすることです。

コードビハインドが起動すると、グリッドビューの行をループし、チェックを探し、データベースを更新して各行をマークし、.DataBind() を使用してグリッドを更新します。これは完全に期待どおりに機能します。

チェックした行をExcelにエクスポートしたいと思います。そのため、これを行うためのメソッドを作成し、行をマークするために各行を更新した後、.DataBind() を更新する前にそれをポップしました。これで、.DataBind() が起動して更新されることはありません。XLS のダウンロードを受け取り、画面を手動で更新すると、期待どおりに行が更新されます。

これが私のコードです:

ASPX (Just a portion of the gridview):
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
                DataKeyNames="MinqNum" DataSourceID="SqlDataSource1" Font-Size="Small" BorderColor="Black"
                BorderStyle="Solid" BorderWidth="1px" CellPadding="0">
                <RowStyle Font-Size="Small" HorizontalAlign="Left" VerticalAlign="Bottom" BorderColor="#999999"
                    BorderStyle="Solid" BorderWidth="1px" Wrap="true" />
                <Columns>
                    <asp:TemplateField>
                    <ItemStyle CssClass="ItemStyle"/>
                    <HeaderStyle Wrap="true" Font-Size="X-Small" HorizontalAlign="Center"
                            VerticalAlign="Bottom" BorderWidth="0px" />
                        <ItemTemplate>
                            <asp:ImageButton ID="btn_editss" runat="server" CommandName="Edit" ImageUrl="~/images/edit.gif" />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:ImageButton ID="btn_savess" runat="server" CommandName="Update" ImageUrl="~/images/save.gif" />
                            <asp:ImageButton ID="btn_cancelss" runat="server" CommandName="Cancel" ImageUrl="~/images/cancel.gif" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Date" SortExpression="MinqDate">
                        <ItemStyle CssClass="ItemStyle" HorizontalAlign="Center" Font-Size="Smaller"/>
                        <HeaderStyle Wrap="true" Font-Size="X-Small" HorizontalAlign="Center" VerticalAlign="Bottom" BorderWidth="0px"/>
                        <ItemTemplate>
                            <asp:Label ID="lbl_minqdate" runat="server" Text='<%#Bind("MinqDate", "{0:MM/dd/yy}") %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:Label ID="lbl_minqdate" runat="server" Text='<%#Bind("MinqDate", "{0:MM/dd/yy}") %>'></asp:Label>
                        </EditItemTemplate>
                    </asp:TemplateField>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>


Button Click Event (codebehind):
Protected Sub btn_markshipped_clicked(ByVal sender As Object, ByVal e As EventArgs)
    For Each row As GridViewRow In GridView1.Rows
        If row.RowType = DataControlRowType.DataRow Then
            Dim isChecked As Boolean = DirectCast(row.FindControl("cb_supship"), CheckBox).Checked
            If isChecked Then
                'btn_markshipped.Text = "changed"
                Dim cmd As New SqlCommand("UPDATE InquiryV4.dbo.Main SET Sup_Shipped = 'S' WHERE MinqNum = @MinqNum")
                cmd.Parameters.AddWithValue("@MinqNum", row.Cells(5).Controls.OfType(Of Label)().FirstOrDefault().Text)
                'cmd.Parameters.AddWithValue("@Country", row.Cells(2).Controls.OfType(Of DropDownList)().FirstOrDefault().SelectedItem.Value)
                'cmd.Parameters.AddWithValue("@CustomerId", gvCustomers.DataKeys(row.RowIndex).Value)
                Me.ExecuteQuery(cmd, "UPDATE")
            End If
        End If
    Next
    'btnUpdate.Visible = False
    'Me.BindGrid()
    btn_exportexcel()
    GridView1.DataBind()
End Sub

btn_exportexcel sub (codebehind):
    Private Sub btn_exportexcel()
    Dim dt = New DataTable()
    dt.Columns.Add("MTX PN")
    dt.Columns.Add("Inq#")
    dt.Columns.Add("Customer")
    dt.Columns.Add("Qty")
    dt.Columns.Add("Eng")
    dt.Columns.Add("A/M")
    For Each gvrow As GridViewRow In GridView1.Rows
        Dim chk As Boolean = DirectCast(gvrow.FindControl("cb_supship"), CheckBox).Checked
        If chk = True Then
            Dim i = gvrow.RowIndex
            Dim lbl_mtxpn As Label = gvrow.FindControl("lbl_mtxpn")
            Dim lbl_inqnum As Label = gvrow.FindControl("lbl_inqnum")
            Dim lbl_customer As Label = gvrow.FindControl("lbl_customer")
            Dim lbl_SamplesRequested As Label = gvrow.FindControl("lbl_SamplesRequested")
            Dim lbl_AssignedTo As Label = gvrow.FindControl("lbl_AssignedTo")
            Dim lbl_LTN_Eng As Label = gvrow.FindControl("lbl_LTN_Eng")
            Dim lbl_AcctMGR As Label = gvrow.FindControl("lbl_AcctMGR")

            Dim dr = dt.NewRow()
            dr.Item("MTX PN") = Convert.ToString(lbl_mtxpn.Text)
            dr.Item("Inq#") = Convert.ToString(lbl_inqnum.Text)
            dr.Item("Customer") = Convert.ToString(lbl_customer.Text)
            dr.Item("Qty") = Convert.ToString(lbl_SamplesRequested.Text)
            dr.Item("Eng") = Convert.ToString(lbl_LTN_Eng.Text) + "(" + Convert.ToString(lbl_AssignedTo.Text) + ")"
            dr.Item("A/M") = Convert.ToString(lbl_AcctMGR.Text)

            dt.Rows.Add(dr)
        End If
    Next
    Dim GridView2 = New GridView()
    GridView2.DataSource = dt
    GridView2.DataBind()
    Response.Clear()
    Response.Buffer = True
    Response.ContentType = "application/ms-excel"
    Response.AddHeader("content-disposition", String.Format("attachment;filename={0}.xls", "selectedrows"))
    Response.Charset = ""
    Dim sw As New StringWriter()
    Dim hw As New HtmlTextWriter(sw)
    GridView2.RenderControl(hw)
    Response.Output.Write(sw.ToString())
    Response.End()
End Sub

私が言ったように、エクスポート機能がなければ、 gridview.databind() は期待どおりに機能し、グリッドビューを更新します。export 関数が間に置かれるとすぐに、.databind() の発生がブロックされます。

何か案は?くすくす笑いのために、代わりに response.redirect も試しましたが、同じ問題があります。

4

2 に答える 2

1

これは、次の理由で発生しています。

  1. 応答をクリアします。
  2. Excelファイルの送信;
  3. 応答を終了します。

つまり、リクエストに対するサーバーの応答は、Excel ファイルを送信することです。ファイルが送信された後に停止するように指示したため、HTML の新しいバッチをブラウザーに送信しません。ご覧のとおり、ブラウザーに新しい HTML を送信していないため、ページは変更されません。

ファイルの送信と新しい HTML のブラウザへの送信の両方が可能であるとは思えませんが、間違っていることが証明される可能性はあります。私が見たほとんどの場合、これらの両方を試みている人は、最初に再バインドとページの更新を行い、次にサーバーに対して Ajax のような GET 呼び出しを行って Excel ファイルを取得します。その他のオプションには、GET を実行して Excel ファイルを返し、送信後に閉じるだけの新しい非常に小さなウィンドウを開くことが含まれます。

于 2012-11-26T22:40:02.570 に答える
0

2 つの GridView または同じデータの 2 つのビューを同じ GridView に表示しようとしていますか?

于 2012-11-26T22:33:34.987 に答える