Error al querer pasar un gridview a un archivo en excel

Tengo definida mi gridview asi

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" DataSourceID="SqlDataSource1" Width="976px">
        </asp:GridView>

y estoy intentando pasar los datos a un excel de la siguiente manera

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridView1.DataBind();
            }

        }

protected void Button2_Click(object sender, EventArgs e)
        {
            ExportToExcel("Informe.xls", GridView1);
        }


        private void ExportToExcel(string nameReport, GridView wControl)
        {
            HttpResponse response = Response;
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            Page pageToRender = new Page();
            HtmlForm form = new HtmlForm();
            form.Controls.Add(wControl);
            pageToRender.Controls.Add(form);
            response.Clear();
            response.Buffer = true;
            response.ContentType = "application/vnd.ms-excel";
            response.AddHeader("Content-Disposition", "attachment;filename=" + nameReport);
            response.Charset = "UTF-8";
            response.ContentEncoding = Encoding.Default;
            pageToRender.RenderControl(htw);
            response.Write(sw.ToString());
            response.End();
        }

en un computador donde hice las primeras pruebas funciona perfecto pero ahora en el nuevo computador muestra el siguiente error con el metodo

pageToRender.RenderControl(htw);

Exception thrown: 'System.Web.HttpException' in System.Web.dll

    Additional information: Control 'GridView1_ctl11' of type 'DataControlPagerLinkButton' must be placed inside a form tag with runat=server.

y ya he probado muchas cosas y no encuentro la solucion

0
задан 23.11.2016, 07:29
3 ответа

Ты мог бы добавлять условие EnableEventValidation = "false" в части, <% Пэйдж твоей страницы где эта информация, которую было бы нужно экспортировать.

Попробуй это и прокомментируй мне, что результат дает тебе.

Привет.

1
ответ дан 24.11.2019, 12:27

Ошибка происходит от, который ты называешь в pageToRender.RenderControl(htw);, так что страница производит исключение, так как контроль производится вне form.

Решение состоит в том, чтобы предотвращать это исключение sobreescribiendo VerifyRenderingInServerForm таким образом:

public override void VerifyRenderingInServerForm(Control control)
{
}
0
ответ дан 24.11.2019, 12:27
  • 1
    я не функционирует этот метод и выходит сейчас на экране это сообщение System. InvalidOperationException: RegisterForEventValidation хан only be called during Render (); – Sebastian Mateus Villegas 23.11.2016, 17:21
  • 2
    Где ты это разместил? Deberí чтобы быть на странице, где ты называешь pageToRender.RenderControl(htw) например перед Page_Load – Pikoh♦ 23.11.2016, 17:51

Уважаемый, я экспортирую того же способа, в котором ты это делаешь данные gridview в excel, рекомендую тебе, что, если ты хочешь экспортировать все то, что ты показываешь в сверчке и не будешь изменять данные, которые находятся в ней, и только размещаешь кнопку экспортировать это было бы должно служить тебе для твоего случая:

protected void btnExportarPendientes_Click(object sender, ImageClickEventArgs e)
{
    string nombreArchivo = "Rep_Fic_Pend_Despacho.xls";
    List<saapt010> listDatos = new List<saapt010>();
    listDatos = BuscarPendientes();
    DataGrid dg = new DataGrid();
    dg.AllowPaging = false;
    dg.DataSource = listDatos;
    dg.DataBind();

    System.Web.HttpContext.Current.Response.Clear();
    System.Web.HttpContext.Current.Response.Buffer = true;
    System.Web.HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
    System.Web.HttpContext.Current.Response.BinaryWrite(Encoding.UTF8.GetPreamble());
    System.Web.HttpContext.Current.Response.Charset = "";
    System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition",
      "attachment; filename=" + nombreArchivo);

    System.Web.HttpContext.Current.Response.ContentType =
      "application/vnd.ms-excel";
    System.IO.StringWriter stringWriter = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlTextWriter =
      new System.Web.UI.HtmlTextWriter(stringWriter);
    dg.RenderControl(htmlTextWriter);
    System.Web.HttpContext.Current.Response.Write(stringWriter.ToString());
    System.Web.HttpContext.Current.Response.End();
}




protected List<saapt010> BuscarPendientes()
{
    List<saapt010> listDatos = new List<saapt010>();
    string script = String.Empty;
    string consulta = String.Empty;
    DateTime fecha = DateTime.Now;

    string conexion = ConfigurationManager.ConnectionStrings["samConnectionString"].ConnectionString;
    IfxConnection conn = new IfxConnection(conexion);
    conn.Open();
    try
    {
        consulta = ViewState["ConsultaPendientes"].ToString();
        IfxCommand cmd = new IfxCommand(consulta, conn);
        cmd.Parameters.Add("fechaUno", IfxType.DateTime).Value = Convert.ToDateTime(ViewState["FechaUnoPen"].ToString());
        cmd.Parameters.Add("fechaDos", IfxType.DateTime).Value = Convert.ToDateTime(ViewState["FechaDosPen"].ToString());
        IfxDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            saapt010 saap = new saapt010();
            if (reader.GetString(1) != "")
            {
                saap.Rut = reader.GetString(1) + "-" + reader.GetString(2);
            }
            else
            {
                saap.Rut = "";
            }
            saap.Fecha = reader.GetDateTime(4).ToString("dd-MM-yyyy");
            saap.NumeroBio = reader.GetString(5);
            saap.Nombre = reader.GetString(6) + " " + reader.GetString(7) + " " + reader.GetString(8);
            saap.ServicioOrigen = reader.GetString(13);
            saap.MedicoOri = reader.GetString(14);
            saap.Prevision = reader.GetString(10);
            saap.Nmuestras = reader.GetString(12);
            if (reader.GetString(16) != "null")
            {
                saap.Supervisor = reader.GetString(16);
            }
            else
            {
                saap.Supervisor = String.Empty;
            }
            if (reader.GetString(15) != "")
            {
                fecha = Convert.ToDateTime(reader.GetString(15));
                saap.FechaDesp = fecha.ToString("dd-MM-yyyy");
            }
            else
            {
                saap.FechaDesp = String.Empty;
            }

            listDatos.Add(saap);
        }
    }
    catch (Exception ex)
    {
        script = "alert('Se ha producido un error al cambiar de página en el modulo de busqueda por pendientes de despacho. Favor comuniquese con el área de informática');";
        ClientScript.RegisterClientScriptBlock(this.GetType(), "Alert", script, true);
    }
    return listDatos;
}

, Если ты обращаешь внимание, создал переменную типа List<>, где я сохраняю все данные о сверчке и эта возвратила ее в функции искать серьги, которые это мой случай. после создал datagrid и я распределяю List< этому datagrid;> с данными о моем сверчке и я заношу в список. Любая вещь ты комментируешь мне и размещаешь код, чтобы помогать тебе больше.

типов Привета

0
ответ дан 24.11.2019, 12:27