<form runat="server" id="f1">
<div runat="server" id="d">
grid view:
<asp:GridView runat="server" ID="g">
</asp:GridView>
</div>
<asp:TextBox runat="server" ID="t" TextMode="MultiLine" Rows="20" Columns="50"></asp:TextBox>
</form>
Kode di belakang:
public partial class ScriptTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
g.DataSource = new string[] { "a", "b", "c" };
g.DataBind();
TextWriter tw = new StringWriter();
HtmlTextWriter h = new HtmlTextWriter(tw);
d.RenderControl(h);
t.Text = tw.ToString();
}
}
Bahkan GridView berada dalam tag from dengan runat = "server", saya masih mendapatkan kesalahan ini.
Ada petunjuk?
runat="server"
di<form>
tag itu). Hanya berpikir ...Jawaban:
Anda memanggil
GridView.RenderControl(htmlTextWriter)
, karena itu halaman memunculkan pengecualian bahwa Kontrol-Server dibuat di luar Formulir.Anda dapat menghindari eksekusi ini dengan mengganti VerifyRenderingInServerForm
public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */ }
Lihat disini dan disini .
sumber
Alternatif untuk menimpa VerifyRenderingInServerForm adalah dengan menghapus kisi dari koleksi kontrol saat Anda melakukan render, lalu menambahkannya kembali saat Anda selesai sebelum halaman dimuat. Ini berguna jika Anda ingin memiliki beberapa metode pembantu umum untuk mendapatkan html grid karena Anda tidak perlu ingat untuk menambahkan timpaan.
Control parent = grid.Parent; int GridIndex = 0; if (parent != null) { GridIndex = parent.Controls.IndexOf(grid); parent.Controls.Remove(grid); } grid.RenderControl(hw); if (parent != null) { parent.Controls.AddAt(GridIndex, grid); }
Alternatif lain untuk menghindari penggantian adalah dengan melakukan ini:
grid.RenderBeginTag(hw); grid.HeaderRow.RenderControl(hw); foreach (GridViewRow row in grid.Rows) { row.RenderControl(hw); } grid.FooterRow.RenderControl(hw); grid.RenderEndTag(hw);
sumber
Tepat setelah Page_Load Anda tambahkan ini:
public override void VerifyRenderingInServerForm(Control control) { //base.VerifyRenderingInServerForm(control); }
Perhatikan bahwa saya tidak melakukan apa pun dalam fungsi tersebut.
EDIT: Tim menjawab hal yang sama. :) Anda juga bisa menemukan jawabannya disini
sumber
Hanya ingin menambahkan cara lain untuk melakukan ini. Saya telah melihat banyak orang di berbagai utas terkait menanyakan apakah Anda dapat menggunakan VerifyRenderingInServerForm tanpa menambahkannya ke halaman induk.
Anda sebenarnya dapat melakukan ini tetapi itu sedikit berlebihan.
Pertama buat kelas Halaman baru yang terlihat seperti berikut:
public partial class NoRenderPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } public override void VerifyRenderingInServerForm(Control control) { //Allows for printing } public override bool EnableEventValidation { get { return false; } set { /*Do nothing*/ } } }
Tidak perlu memiliki .ASPX yang terkait dengannya.
Kemudian dalam kontrol yang ingin Anda render, Anda dapat melakukan hal seperti berikut.
StringWriter tw = new StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(tw); var page = new NoRenderPage(); page.DesignerInitialize(); var form = new HtmlForm(); page.Controls.Add(form); form.Controls.Add(pnl); controlToRender.RenderControl(hw);
Sekarang Anda memiliki kontrol asli yang dirender sebagai HTML. Jika perlu, tambahkan kontrol kembali ke posisi semula. Anda sekarang memiliki HTML yang dirender, halaman seperti biasa dan tidak ada perubahan pada halaman itu sendiri.
sumber
HttpContext.Current.Server.Execute(page, writer, false);
untuk menulis HTML - pemanggilancontrolToRender.RenderControl(hw);
tidak memunculkan salah satu peristiwa kontrol misalnyaPage_Load
jadi ketika kontrol sedang dirender, itu kosong.Inilah Kode Saya
protected void btnExcel_Click(object sender, ImageClickEventArgs e) { if (gvDetail.Rows.Count > 0) { System.IO.StringWriter stringWrite1 = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite1 = new HtmlTextWriter(stringWrite1); gvDetail.RenderControl(htmlWrite1); gvDetail.AllowPaging = false; Search(); sh.ExportToExcel(gvDetail, "Report"); } } public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */ }
sumber