今天有人問我,如果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); } } }