0
다음과 같이 정의 된 사용자 정의 컨트롤이 있습니다. Home_ExportExcel
을 클릭하면UpdatePanel을 사용하여 UserControl에서 파일 다운로드
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<table>
<tr>
<td>
<asp:ImageButton ID="ImageButton" runat="server" />
</td>
<td>
<asp:Label ID="lblHeader" runat="server" Text=""></asp:Label>
</td>
</tr>
</table>
<asp:Button runat="server" ID="saveLayoutBtn" Text="Save" OnClick="SaveBtn_Click"
ToolTip="Save current grid layout" />
<asp:Button ID="Home_ExportExcel" runat="server" Text="Export To Excel" OnClick="Home_ExportExcel_Click" Visible="false" />
<asp:PlaceHolder ID="placeHolder" runat="server"></asp:PlaceHolder>
<asp:Label ID="notificationLbl" runat="server" Text="" Font-Bold="true"></asp:Label>
<div id="DataGridWrapper">
<!--A Grid View tat displays Data-->
</div>
</ContentTemplate>
</asp:UpdatePanel>
지금, 나는 GridDtata가 엑셀/XML 파일로 내보낼 수 싶습니다. 내가 대신 내가 HTTP 응답에 XML 형식으로 그리드 데이터를 얻을, usercontrol.ascx.cs
protected void Home_ExportExcel_Click(object sender, EventArgs args)
{
GenerateWorkSheetWithSB(resultTbl, this.MasterPage.CurrentLibrary);
}
public void GenerateWorkSheetWithSB(DataTable resultRequests, string libName, string advancedSearch = null)
{
WindowsImpersonationContext impersonationContext;
if (BLSecurity.ImpersonateFacelessAccount(out impersonationContext))
{
int iWorkSheet = 1, iCol = 1, iRow = 1;
System.Text.StringBuilder strExcelXml = new System.Text.StringBuilder();
try
{
iWorkSheet = 1;
iCol = 15;
iRow = resultRequests.Rows.Count + 1;
iWorkSheet++;
iRow++;
iCol++;
}
catch (Exception ex)
{
}
//First Write the Excel Header
strExcelXml.Append(ExcelHeader());
// Get all the Styles
strExcelXml.Append(ExcelStyles());
// Worksheet options Required only one time
strExcelXml.Append(ExcelWorkSheetOptions());
for (int i = 1; i < iWorkSheet; i++)
{
// Create First Worksheet tag
strExcelXml.Append("<Worksheet ss:Name=\"WorkSheet" + i.ToString() + "\">");
// Then Table Tag
strExcelXml.Append("<Table ss:DefaultColumnWidth=\"150\" >");
SetupExcelHeaderWorksheet(strExcelXml, libName);
foreach (DataRow row in resultRequests.Rows)
//foreach (DataRow row in resultRequests.Rows)
SetupExcelDataWorksheet(strExcelXml, row, libName);
strExcelXml.Append("</Table>");
strExcelXml.Append("</Worksheet>");
}
// Close the Workbook tag (in Excel header you can see the Workbook tag)
strExcelXml.Append("</Workbook>\n");
#region "Write Into File"
string uploadTempPath = "D:"; //ProfileBroker.GetProfileValue(AppProfileConst.UPLOAD_SERVER_TEMPPATH);
string tmpFilePath = uploadTempPath + "\\HomeGridData.xml";
string convertData = ConvertHTMLToExcelXML(strExcelXml.ToString());
byte[] byteArray = Encoding.UTF8.GetBytes(convertData);
//MemoryStream stream = new MemoryStream(byteArray);
File.WriteAllBytes(tmpFilePath, byteArray);
//this.Page.Response.Buffer = true;
this.Page.Response.Clear();
this.Page.Response.AddHeader("content-disposition", "attachment; filename=" + Path.GetFileName(tmpFilePath));
this.Page.Response.ContentType = "application/octet-stream";
this.Page.Response.TransmitFile(tmpFilePath); //does not work inside WARP unless there is JS, refer to ascx file
this.Page.Response.End();
#endregion
SecurityUtils.UndoImpersonation(impersonationContext);
}
else
{
Response.Write("<script>alert('File does not exist. Please contact tool support.')</script>");
}
}
내가 어떤 파일이 다운로드되지 않습니다에 다음과 같은 코드가 있습니다. .aspx 페이지에서 동일한 코드를 사용하면 제대로 작동하고 파일이 다운로드됩니다. this 및 this이 (가) SO에서 발견되었으며 UpdatePanel을 사용하면 문제가 될 수 있습니다. 그러나 나는 무엇이 내가 여기에서 놓치고 있는지 명확하지 않다.
을 시도 다시 게시 할 필요가 파일을 다운로드하려면에서이 다르다 that ack – Programmerzzz
기본적으로 업데이트 패널은 비동기 포스트 백을 구현합니다. 따라서 전체 포스트를 원한다면 명시 적으로 포스트 백 트리거를 생성해야합니다. – Krishna
감사합니다. 'Krishna'는 저에게 효과적이었습니다. – Programmerzzz