вложенный gridview экспорт в Excel, asp.net c # - PullRequest
1 голос
/ 22 декабря 2011

Я хочу экспортировать родительский вид сетки и вложенный вид сетки в Excel.

У меня есть код, который работает только для экспорта обычного простого вида сетки.Попытался отладить код, обнаружил, что там нет ошибок или чего-то еще.

Это только после того, как я нажму кнопку экспорта, он не экспортируется в Excel.

вот мой код

 protected void asd()
{

    string title = "";
    string attempt = "SELECT * FROM Poll Where PollID = '" + Session["abc"] + "'";

    cmd = new SqlCommand(attempt, con);
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        title = dr["PollTitle"].ToString();
    }

    string filename = String.Format(title + " RESULTS. " + "{0}_{1}.xls",
 DateTime.Today.Month.ToString(), DateTime.Today.Year.ToString());

    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    Response.Charset = "";

    // SetCacheability doesn't seem to make a difference (see update)
    Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

    Response.ContentType = "application/vnd.xls";

    System.IO.StringWriter stringWriter = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);

    // Replace all gridview controls with literals
    ClearControls(GridView3);

    // Throws exception: Control 'ComputerGrid' of type 'GridView'
    // must be placed inside a form tag with runat=server.
    // ComputerGrid.RenderControl(htmlWrite);

    // Alternate to ComputerGrid.RenderControl above
    System.Web.UI.HtmlControls.HtmlForm form
        = new System.Web.UI.HtmlControls.HtmlForm();
    Controls.Add(form);
    form.Controls.Add(GridView3);
    form.RenderControl(htmlWriter);

    Response.Write(stringWriter.ToString());
    Response.End();
}

private void ClearControls(Control control)
{
    for (int i = control.Controls.Count - 1; i >= 0; i--)
    {
        ClearControls(control.Controls[i]);
    }

    if (!(control is TableCell))
    {
        if (control.GetType().GetProperty("SelectedItem") != null)
        {
            LiteralControl literal = new LiteralControl();
            control.Parent.Controls.Add(literal);
            try
            {
                literal.Text =
                    (string)control.GetType().GetProperty("SelectedItem").
                        GetValue(control, null);
            }
            catch
            { }
            control.Parent.Controls.Remove(control);
        }
        else if (control.GetType().GetProperty("Text") != null)
        {
            LiteralControl literal = new LiteralControl();
            control.Parent.Controls.Add(literal);
            literal.Text =
                (string)control.GetType().GetProperty("Text").
                    GetValue(control, null);
            control.Parent.Controls.Remove(control);
        }
    }
    return;

}
protected void Export_buttonClick(object sender, EventArgs e)
{
    asd();
}

этот код работает для обычного вида сетки, но не для кода с вложенным видом сетки.

1 Ответ

0 голосов
/ 04 января 2012

В прошлом я сталкивался с ошибкой 'должен быть помещен в тег формы с runat = server' и решил эту проблему, добавив следующий метод переопределения в коде моей страницы:

public override void VerifyRenderingInServerForm(Control control) {}

Подробнее о MSDN .

Для справки, я также использовал этот код для экспорта моих GridView:

Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=your_file.xls");
Response.Charset = "";
Response.ContentEncoding = System.Text.Encoding.Default;
Response.ContentType = "application/ms-excel";

StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
your_GridView.RenderControl(hw);

Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...