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
Ошибка происходит от, который ты называешь в pageToRender.RenderControl(htw);
, так что страница производит исключение, так как контроль производится вне form.
Решение состоит в том, чтобы предотвращать это исключение sobreescribiendo VerifyRenderingInServerForm таким образом:
public override void VerifyRenderingInServerForm(Control control)
{
}
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;> с данными о моем сверчке и я заношу в список. Любая вещь ты комментируешь мне и размещаешь код, чтобы помогать тебе больше.
типов Привета