[c#] 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)하고 있으므로 페이지에서 Server-Control이 Form 외부에서 렌더링되었다는 예외가 발생합니다.

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);
}

함수에서 아무것도하지 않습니다.

편집 : Tim 은 같은 대답을했습니다. 🙂 여기 에서 답을 찾을 수도 있습니다.


답변

이 작업을 수행하는 다른 방법을 추가하고 싶습니다. 여러 관련 스레드에서 여러 사람이 부모 페이지에 추가하지 않고 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. */
    }


답변