Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Excel导出不工作后ASP GridView刷新_Asp.net_Vb.net_Data Binding_Gridview_Export To Excel - Fatal编程技术网

Asp.net Excel导出不工作后ASP GridView刷新

Asp.net Excel导出不工作后ASP GridView刷新,asp.net,vb.net,data-binding,gridview,export-to-excel,Asp.net,Vb.net,Data Binding,Gridview,Export To Excel,我在Ajax UpdatePanel中有一个Gridview。在每个GV行中,我都有一个复选框字段。其想法是,用户检查他们想要的行,然后单击一个按钮,将该行中的标签更新为“shipped”,然后将选中的行导出到xls文件(csv) 当我的codebehind触发时,它在gridview行中循环,查找检查,更新数据库以标记每一行,然后使用.DataBind()刷新网格。这是完美的,正如预期的那样 现在我还想将选中的行导出到excel。因此,我创建了一个方法来执行此操作,并在更新每一行以标记行之后,

我在Ajax UpdatePanel中有一个Gridview。在每个GV行中,我都有一个复选框字段。其想法是,用户检查他们想要的行,然后单击一个按钮,将该行中的标签更新为“shipped”,然后将选中的行导出到xls文件(csv)

当我的codebehind触发时,它在gridview行中循环,查找检查,更新数据库以标记每一行,然后使用.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
ASPX(只是gridview的一部分):
按钮单击事件(代码隐藏):
已单击受保护的子btn_标记(ByVal发件人作为对象,ByVal e作为事件参数)
作为GridView1.Rows中的GridViewRow的每一行
如果row.RowType=DataControlRowType.DataRow,则
Dim被选中为Boolean=DirectCast(row.FindControl(“cb_supship”),复选框)。选中
如果我被检查过的话
'btn_markshipped.Text=“已更改”
Dim cmd作为新的SqlCommand(“UPDATE inquirryv4.dbo.Main SET Sup_Shipped='S',其中MinqNum=@MinqNum”)
cmd.Parameters.AddWithValue(“@MinqNum”,row.Cells(5).Controls.OfType(Of Label)().FirstOrDefault().Text)
'cmd.Parameters.AddWithValue(“@Country”,row.Cells(2).Controls.OfType(DropDownList的)().FirstOrDefault().SelectedItem.Value)
'cmd.Parameters.AddWithValue(@CustomerId),gvCustomers.DataKeys(row.RowIndex.Value)
Me.ExecuteQuery(cmd,“更新”)
如果结束
如果结束
下一个
'btnUpdate.Visible=False
'Me.BindGrid()
btn_exportexcel()
GridView1.DataBind()
端接头
btn_导出Excel子系统(代码隐藏):
专用子btn_exportexcel()
Dim dt=新数据表()
dt.列添加(“MTX PN”)
dt.Columns.Add(“Inq#”)
dt.列。添加(“客户”)
dt.列添加(“数量”)
dt.列添加(“工程”)
dt.列添加(“A/M”)
对于GridView1.Rows中作为GridViewRow的每个gvrow
Dim chk As Boolean=DirectCast(gvrow.FindControl(“cb_supship”),复选框)。选中
如果chk=True,则
Dim i=gvrow.RowIndex
Dim lbl\U mtxpn As Label=gvrow.FindControl(“lbl\U mtxpn”)
标注lbl\U inqnum As Label=gvrow.FindControl(“lbl\U inqnum”)
标注lbl\U客户作为标签=gvrow.FindControl(“lbl\U客户”)
尺寸lbl_样本请求为Label=gvrow.FindControl(“lbl_样本请求”)
Dim lbl_AssignedTo As Label=gvrow.FindControl(“lbl_AssignedTo”)
尺寸lbl\U LTN\U Eng As Label=gvrow.FindControl(“lbl\U LTN\U Eng”)
Dim lbl\U AcctMGR As Label=gvrow.FindControl(“lbl\U AcctMGR”)
Dim dr=dt.NewRow()
dr.Item(“MTX PN”)=Convert.ToString(lbl\u mtxpn.Text)
dr.Item(“Inq#”)=Convert.ToString(lbl_inqnum.Text)
dr.Item(“客户”)=Convert.ToString(lbl\u Customer.Text)
dr.Item(“数量”)=转换为字符串(lbl\u samplerequested.Text)
dr.Item(“Eng”)=Convert.ToString(lbl\u LTN\u Eng.Text)+“(“+Convert.ToString(lbl\u AssignedTo.Text)+”)”
dr.Item(“A/M”)=转换为字符串(lbl\u AcctMGR.Text)
dt.行.添加(dr)
如果结束
下一个
Dim GridView2=新GridView()
GridView2.DataSource=dt
GridView2.DataBind()
答复:Clear()
Response.Buffer=True
Response.ContentType=“应用程序/ms excel”
Response.AddHeader(“内容处置”,String.Format(“附件;文件名={0}.xls”,“selectedrows”))
Response.Charset=“”
Dim sw作为新的StringWriter()
Dim hw作为新的HtmlTextWriter(软件)
GridView2.RenderControl(硬件)
Response.Output.Write(sw.ToString())
答复:End()
端接头
如前所述,如果没有导出函数,gridview.databind()将按预期工作并更新gridview。导出函数一置于两者之间,就会阻止.databind()的发生


有什么想法吗?只是为了好玩,我还尝试了一个response.redirect,这也有同样的问题。

您是想在同一个GridView中显示两个GridView还是两个相同数据的视图?

发生这种情况是因为您:

  • 清除响应
  • 发送Excel文件
  • 结束回应
  • 换句话说,服务器对您的请求的答复是发送excel文件。它不会向浏览器发送新的一批HTML,因为您告诉它在文件发送后停止。正如您所观察到的,您的页面没有改变,因为您没有向浏览器发送任何新的HTML


    我认为不可能同时发送文件和向浏览器发送新的HTML,但我很容易被证明是错误的。我见过的大多数情况下,人们尝试这两种方法时都会先进行重新绑定和页面刷新,然后对服务器进行类似Ajax的GET调用以获取Excel文件。其他选项包括打开一个新的非常小的窗口,该窗口只执行GET操作并返回Excel文件,然后在发送后关闭。

    因此,似乎在我的btn\u exportex的“响应”部分的某个地方