0

我知道有很多关于从 gridview 导出到 excel 的详细说明的问题,但我找不到我的特殊情况。

我有一个网格视图,它显示来自搜索的五个字段的记录。用户可以在复选框中选中任意数量的记录。单击按钮后,我可以仅将检查的记录成功导出到 Excel。导出为 HTML。我在这里使用 Matt Berseth 的技术:http: //mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html

我添加了一个检查记录是否由用户检查,这工作正常。

但我有一个要求,对于导出的检查记录,用户希望查看整个记录(即仅选定记录中的所有字段)。

实现这一目标的好策略是什么?

我已经尝试检索网格视图中的所有字段,并将除五个所需字段之外的所有字段设置为不可见。然后在导出按钮单击事件中,将字段设置为可见并重新绑定。那里没有运气。

谢谢你的帮助。

4

1 回答 1

0

听起来您应该遍历行以查看已检查的行。

foreach (GridViewRow row in gridView.Rows) 
{
    if(row.RowType == DataControlRowType.DataRow)
    {
      CheckBox cb = row.FindControl("CheckBoxID") as CheckBox;

      if(cb != null && cb.Checked) 
      {
        // Logic here.
      }
}

从那里,您可以使用几种不同的机制导出到 excel,具体取决于您的需要。如果您只需要 xls 文件,我过去使用过的一个是 NPOI——它是开源的,并为它提供了一个不错的框架。这是他们网站的链接:

http://npoi.codeplex.com/

- 编辑

阅读您的评论后,也许这会有所帮助。

ASPX 代码:

    <asp:GridView ID="gridView" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField HeaderText="Checkbox Column">
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBoxID" runat="server" />
                </ItemTemplate>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Visible Column">
                <ItemTemplate>
                    <asp:Label ID="lblVisibleColumn"  runat="server" Text='<%# Eval("VisibleColumn")%>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Hidden Column" Visible="false">
                <ItemTemplate>
                    <asp:Label ID="lblHiddenColumn"  runat="server" Text='<%# Eval("HiddenColumn")%>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField> 
        </Columns>
    </asp:GridView>

    <asp:Button ID="btnExport" runat="server" Text="Export" OnClick="btnExport_Click" />

后端代码:

        public class MyDataColumn
        {
            public string visibleColumn { get; set; }
            public string hiddenColumn { get; set; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DataTable dataTable = new DataTable();
                List<MyDataColumn> dataColumns = new List<MyDataColumn>();

                for (int i = 0; i < 10; i++)
                {
                    dataColumns.Add(new MyDataColumn()
                    {
                        visibleColumn = string.Format("Visible Column {0}", i),
                        hiddenColumn = string.Format("Hidden Column {0}", i)
                    });
                }

                gridView.DataSource = dataColumns;
                gridView.DataBind();
            }
        }

        protected void btnExport_Click(object sender, EventArgs e)
        {
            List<MyDataColumn> dataColumnsToExport = new List<MyDataColumn>();

            foreach (GridViewRow row in gridView.Rows) 
            {
                if (row.RowType == DataControlRowType.DataRow)
                {
                    CheckBox cb = row.FindControl("CheckBoxID") as CheckBox;

                    if (cb != null && cb.Checked)
                    {
                        Label lblVisibleColumn = row.FindControl("lblVisibleColumn") as Label;
                        Label lblHiddenColumn = row.FindControl("lblHiddenColumn") as Label;

                        dataColumnsToExport.Add(new MyDataColumn()
                        {
                            visibleColumn = lblVisibleColumn.Text,
                            hiddenColumn = lblHiddenColumn.Text
                        });
                    }
                }
            }

            GridView gridViewToExport = new GridView();
            gridViewToExport.DataSource = dataColumnsToExport;
            gridViewToExport.DataBind();

            //Do Something With gridViewToExport
            //GridViewExportUtil.Export("GridView.xls", gridViewToExport);
        }

如果需要,这应该很容易转换为 DataTable——我使用自己的类来缩短代码。

于 2013-01-07T21:06:06.770 回答