GridView, GridView bir form etiketi içinde olsa bile runat = "server" içeren bir form etiketinin içine yerleştirilmelidir


87
<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>

Arkasındaki kod:

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 bile runat = "server" ile bir from etiketi içinde olsa da, bu hatayı alıyorum.

Herhangi bir ipucu lütfen?


2
Birisi zaten (ya da zaten beyan olabilir veya olmayabilir form etiketi bulunan Usta sayfasını kullanıyorsa önce bunu görmüştüm runat="server"'s içinde <form>etiketi). Sadece bir düşünce ...
lhan

@Lloyd: Ama herhangi bir Ana Sayfam yok, bu sayfayı sadece bu hatayı test etmek için oluşturdum.
gençlik

Merhaba, kodunuzu kopyaladım ancak sorunu tekrarlayamıyorum. Lütfen tüm dosya içeriğini (her satır) sorunuza veya Pastebin'e ekleyebilir misiniz? Teşekkürler
christofr

Yanıtlar:


176

Çağırıyorsunuz GridView.RenderControl(htmlTextWriter), bu nedenle sayfa, bir Form dışında Sunucu Kontrolünün işlendiği bir istisna yaratıyor.

VerifyRenderingInServerForm'u geçersiz kılarak bu yürütmeyi önleyebilirsiniz.

public override void VerifyRenderingInServerForm(Control control)
{
  /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
     server control at run time. */
}

Buraya ve buraya bakın .


İçeriğini bir E-posta Mesajına dönüştürmek istediğim bir GridView'ım var, bu yüzden onu formdan çıkarmam gerekiyor. Bu yöntemi geçersiz kılamıyorum çünkü ana sayfa Sharepoint'e ait. My Grid, sharepoint sayfasındaki bir web bölümü içindeki bir Kullanıcı denetimidir.
gençlik

Ayrıca, GridView'ı dinamik olarak bir HtmlForm'a doğrudan ekleyip sonra onu işlediğimde, mükemmel şekilde işliyor. Bu, yalnızca ızgara dışında bir formun varlığını gerektirdiği anlamına gelir. Ancak, bu DIV'yi HtmlForm'a dinamik olarak eklediğimde, Grid DIV'nin bir alt öğesi olmasına ve bununla birlikte HtmlForm'a da eklenmesine rağmen, bu hata tekrar geliyor.
gençlik

ızgaranız bir .ascx kullanıcı denetimi içindeyse bu çalışmayacaktır. bu durumda aşağıdaki Chris Mullins cevabına bakın. Hem Tim hem de Chris'in tekniklerini kullandım ve harika çalışıyorlar.
Taylor Brown

Zarif bir çözümü seviyorum! Beni heyecanlandırıyor: D
Nikolay

3
Harika çalıştı. Sadece bir uyarı, "RegisterForEventValidation yalnızca Render () sırasında çağrılabilir" diyen bir hata alabilirsiniz; Öyleyse, sayfanın biçimlendirmesinde EventValidation'ı false olarak ayarladığınızdan emin olun.
Al Belmondo

29

VerifyRenderingInServerForm'u geçersiz kılmanın bir alternatifi, oluşturmayı yaparken ızgarayı denetimler koleksiyonundan kaldırmak ve işiniz bittiğinde sayfa yüklenmeden önce tekrar eklemektir. Bu, grid html'sini almak için bazı genel yardımcı metotlara sahip olmak istiyorsanız yararlıdır çünkü geçersiz kılmayı eklemeyi hatırlamanız gerekmez.

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

Geçersiz kılmayı önlemenin bir başka alternatifi de bunu yapmaktır:

grid.RenderBeginTag(hw);
grid.HeaderRow.RenderControl(hw);
foreach (GridViewRow row in grid.Rows)
{
    row.RenderControl(hw);
}
grid.FooterRow.RenderControl(hw);
grid.RenderEndTag(hw);

Becerikli !! Yarın deneyeceğim.
gençlik

ızgarayı bir asp kullanıcı denetimi (.ascx) içinde oluşturmaya çalışırken, 1. yöntemi kullanmak benim için harika çalıştı.
Taylor Brown

3
1. gridview, LinkButton gibi kontroller içeriyorsa çalışmaz - 'Kontrol tipi' LinkButton ', runat = server' hatası olan bir form etiketi içine yerleştirilmelidir. 2. Bu tekniğin neden işe yaradığını açıklar mısınız?
BornToCode

@BornToCode Kodda ızgara görünümünüz için sıralamayı devre dışı bırakın.
Adi Solar

14

Page_Load'unuzdan hemen sonra şunu ekleyin:

public override void VerifyRenderingInServerForm(Control control)
{
    //base.VerifyRenderingInServerForm(control);
}

İşlevde hiçbir şey yapmadığımı unutmayın.

DÜZENLEME: Tim aynı şeyi yanıtladı. :) Cevabı burada da bulabilirsiniz


2

Bunu yapmanın başka bir yolunu eklemek istiyorum. Çeşitli ilgili konulardaki birden fazla kişinin VerifyRenderingInServerForm'u ana sayfaya eklemeden kullanıp kullanamayacağınızı sorduğunu gördüm.

Aslında bunu yapabilirsiniz ama bu biraz zor bir durum.

Öncelikle aşağıdakine benzer yeni bir Sayfa sınıfı oluşturun:

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*/ }
    }
}

Kendisiyle ilişkilendirilmiş bir .ASPX'e sahip olması gerekmez.

Ardından render etmek istediğiniz kontrolde aşağıdaki gibi bir şey yapabilirsiniz.

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

Artık orijinal kontrolünüz HTML olarak oluşturulmuş durumda. Gerekirse, kontrolü orijinal konumuna geri ekleyin. Artık HTML'yi oluşturdunuz, sayfa normal olarak ve sayfanın kendisinde hiçbir değişiklik yok.


@DanielEdwards DesignerInitialize () sizin için ne yapıyor?
JJS

Bu işe yarıyor, ancak HttpContext.Current.Server.Execute(page, writer, false);HTML'yi yazmak için kullanmam gerekiyordu - çağırma controlToRender.RenderControl(hw);, kontrol olaylarının hiçbirini yükseltmedi, örneğin Page_Load, kontrol oluşturulurken, boştu.
DGibbs

0

İşte Kodum

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. */
    }

Neden bu yanıtı cevaplandıktan 5 yıl sonra eklediniz? Ve aynı cevap.
Mukus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.