GridView가 양식 태그 내에 있는 후에도 runat="server"가 있는 양식 태그 내에 GridView를 배치해야 합니다.
<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>
코드 배경:
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();
}
}
GridView도 runat="server"의 from 태그 안에 있지만 여전히 이 오류가 발생합니다.
단서가 있습니까?
전화를 걸겠습니다.GridView.RenderControl(htmlTextWriter)
따라서 페이지는 서버 컨트롤이 양식 외부에 렌더링되었다는 예외를 제기합니다.
VerifyRenderingInServerForm을 재정의하여 이 실행을 방지할 수 있습니다.
public override void VerifyRenderingInServerForm(Control control)
{
/* Confirms that an HtmlForm control is rendered for the specified ASP.NET
server control at run time. */
}
VerifyRenderingInServerForm을 재정의하는 다른 방법은 렌더를 수행하는 동안 컨트롤 집합에서 그리드를 제거한 다음 페이지가 로드되기 전에 완료되면 그리드를 다시 추가 방법입니다.재정의를 추가하는 것을 기억할 필요가 없으므로 그리드 html을 가져오는 일반적인 도우미 방법을 사용하려는 경우 유용합니다.
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);
}
재정의를 방지하는 또 다른 방법은 다음과 같습니다.
grid.RenderBeginTag(hw);
grid.HeaderRow.RenderControl(hw);
foreach (GridViewRow row in grid.Rows)
{
row.RenderControl(hw);
}
grid.FooterRow.RenderControl(hw);
grid.RenderEndTag(hw);
Page_Load 바로 뒤에 다음을 추가합니다.
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}
나는 그 기능에서 아무것도 하지 않는다는 것을 참고하세요.
편집: 팀도 같은 대답을 했습니다.:) 여기에서도 답을 찾을 수 있습니다.
다른 방법을 추가하고 싶을 뿐입니다.다양한 관련 스레드에서 여러 사람이 VerifyRenderingInServerForm을 상위 페이지에 추가하지 않고 사용할 수 있는지 문의하는 것을 보았습니다.
실제로 할 수는 있지만 약간의 부담감이 있습니다.
먼저 다음과 같은 모양의 새 페이지 클래스를 만듭니다.
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*/ }
}
}
.ASPX를 연결할 필요가 없습니다.
그런 다음 렌더링하려는 컨트롤에서 다음과 같은 작업을 수행할 수 있습니다.
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);
이제 원래 컨트롤이 HTML로 렌더링됩니다.필요한 경우 컨트롤을 원래 위치에 다시 추가합니다.이제 HTML이 렌더링되고 페이지가 정상적으로 표시되며 페이지 자체는 변경되지 않습니다.
내 코드가 있습니다.
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. */
}
팀 슈멜터의 답변은 저에게 많은 도움이 되었지만, 제 aspx 페이지에서 작동하기 위해서는 한 가지 더 해야 했습니다.보고서 자동화를 위해 내장된 GridView 컨트롤(HTML)을 이메일로 보내기 위해 이 코드를 사용합니다.
오버라이드 서브를 추가하는 것 외에도 Me에서 렌더()를 해야 했습니다..onload를 처리합니다. 그렇지 않으면 RenderControl 행에서 오류가 발생했습니다.
Protected Sub Page_After_load(sender As Object, e As EventArgs) Handles Me.Unload
If runningScheduledReport Then
Dim stringBuilder As StringBuilder = New StringBuilder()
Dim stringWriter As System.IO.StringWriter = New System.IO.StringWriter(stringBuilder)
Dim htmlWriter As HtmlTextWriter = New HtmlTextWriter(stringWriter)
GridView1.RenderControl(htmlWriter)
Dim htmlcode As String = stringBuilder.ToString()
Func.SendEmail(Context.Request.QueryString("email").ToString, htmlcode, "Auto Report - Agent Efficiency", Nothing)
End If
End Sub
언급URL : https://stackoverflow.com/questions/6343630/gridview-must-be-placed-inside-a-form-tag-with-runat-server-even-after-the-gri
'programing' 카테고리의 다른 글
MS SQL Server에서 예약된 단어/키워드인 테이블 이름 만들기 (0) | 2023.06.27 |
---|---|
파이썬 문자열에서 하위 문자열이 처음 나타나는 것을 어떻게 찾을 수 있습니까? (0) | 2023.06.27 |
Oracle에 대한 Linkq를 사용하는 방법이 있습니까? (0) | 2023.06.27 |
SQL Server 데이터베이스의 소유자를 변경하려면 어떻게 해야 합니까? (0) | 2023.06.22 |
모든 어셈블리에서 유형 찾기 (0) | 2023.06.22 |