今天有人問我,如果Girdview模板列裡使用了自定義控件,那導出的時候如何處理?
比如該自定義控件包含一個Dropdownlist和三個Label控件,其中用來在頁面上顯示數據的是其中一個 Label控件,現在的問題是,如果不在PrepareControlForExport()中對該自定義控件進行處理,那麼導 出的Excel文件的對應Gridview中使用了自定義控件的列的內容全部相同(為Dropdownlist控件的第一個 Item),但是對該自定義控件進行處理的話,不知道該如何才能正確的取出它的值(用來顯示的label中的 值),試圖無法把自定義控件轉換成Dropdowlist和Label中的任何一種,但強制轉換的話運行到該語句會 報錯。
我們首先來看看在GridView導出到Excel和開源圖表工具提到的導出工具中的開發,源文件可以在這裡 下載:Export GridView to Excel
在GridViewExportUtil.cs中,函數PrepareControlForExport是這樣的:
/// <summary>
/// Replace any of the contained controls with literals
/// </summary>
/// <param name="control"></param>
private static void PrepareControlForExport(Control control)
{
for (int i = 0; i < control.Controls.Count; i++)
{
Control current = control.Controls[i];
if (current is LinkButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
}
else if (current is ImageButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as
ImageButton).AlternateText));
}
else if (current is HyperLink)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
}
else if (current is DropDownList)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as
DropDownList).SelectedItem.Text));
}
else if (current is CheckBox)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ?
"True" : "False"));
}
if (current.HasControls())
{
GridViewExportUtil.PrepareControlForExport(current);
}
}
}