Soru GridView, form etiketinin içinde olsa bile GridView, runat = “server” ile bir form etiketinin içine yerleştirilmelidir.


<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 bir runat = "server" etiketi içerisindedir, hala bu hatayı alıyorum.

Herhangi bir ipucu lütfen?


76
2018-06-14 12:41


Menşei


Birisi zaten bir form etiketi olan bir Master sayfasını kullanıyorsa bunu daha önce de görmüştüm (bu zaten bildirilmiş olabilir veya olmayabilir) runat="server" içinde <form> etiket). Sadece bir düşünce... - lhan
@Lloyd: Ama hiçbir ana sayfam yok, sadece bu hatayı test etmek için bu sayfayı oluşturdum. - teenup
Merhaba, kodunuzu kopyaladım ancak sorunu kopyalayamıyorum. Tüm dosya içeriğini (her satır) sorunuza veya Pastebin'e koyabilir misiniz? Teşekkürler - christofr
olası kopyası GridView, oluşturulması için bir form etiketine eklenmelidir. - Grant Thomas


Cevaplar:


Sen çağırıyorsun GridView.RenderControl(htmlTextWriter)dolayısıyla sayfa bir Sunucu Denetimi'nin bir Form dışında oluşturulduğu bir istisna ortaya çıkarır.

Bu uygulamayı geçersiz kılmaktan kaçınabilirsiniz. VerifyRenderingInServerForm

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

Görmek İşte ve İşte.


149
2018-06-14 13:01



İçeriğimi bir E-posta İletisine dönüştürmek istediğim bir GridView'im var, bu yüzden onu form dışı bırakmam gerekiyor. Ana makine sayfası Sharepoint olduğundan bu yöntemi geçersiz kılamıyorum. Kılavuzum, sharepoint sayfasındaki bir web bölümü içinde bir Usercontrol. - teenup
Ayrıca, GridView'ı doğrudan bir HtmlForm'a dinamik olarak eklediğimde ve oluşturduğumda, mükemmel bir şekilde işliyor. Bu sadece bir ızgara dışında bir formun varlığını gerektirir anlamına gelir. Ancak, bu DIV'yi dinamik olarak HtmlForm'a eklediğimde, Grid DIV'nin bir alt öğesi olmasına ve HtmlForm'a birlikte eklenmesine rağmen bu hata yine gelir. - teenup
@Tim Schmelter ... siz tanrınız! Teşekkür ederim!! - DotNetRookie
ızgaralarınız bir .ascx kullanıcı denetimi içinde ise bu işe yaramaz. Bu durumda Chris Mullins'in cevabını aşağıya bakın. Hem Tim hem de Chris'in tekniklerini kullandım ve harika çalışıyorlar. - Taylor Brown
Harika çalıştı. Sadece bir başınızı "RegisterForEventValidation sadece Render () sırasında çağrılabilir" diyen bir hata alabilirsiniz. Bu şekilde ayarlanmışsa, EventValidation öğesini sayfa için işaretlemede false olarak ayarladığınızdan emin olun. - Al Belmondo


VerifyRenderingInServerForm'u geçersiz kılmanın bir alternatifi, oluşturmayı gerçekleştirirken ızgaranın denetimler koleksiyonundan kaldırılması ve ardından sayfa yüklenmeden önce eklediğinizde onu eklemektir. Bu, geçersiz kılmayı eklemeniz gerekmediğinden, grid html'yi almak için bazı genel yardımcı yöntemlere sahip olmak istiyorsanız yararlı olur.

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ı önlemek için başka bir alternatif 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);

26
2018-06-14 14:19



Adroit !! Yarın deneyeceğim. - teenup
ızgarayı bir asp kullanıcı denetimi (.ascx) içine koymaya çalışırken, 1. yöntemi kullanarak benim için harika çalıştı. - Taylor Brown
Eğer gridview LinkButton gibi kontroller içeriyorsa işe yaramıyor - 'LinkButton' tipinin kontrolü 'runat = server' hatasıyla bir form etiketinin içine yerleştirilmelidir. 2.Bu tekniğin neden işe yaradığını açıklar mısınız? - BornToCode
@BornToCode Izgarada ızgara görünümünüz için sıralamayı devre dışı bırakın. - Adi Solar
sıralama ve sayfalandırmayı devre dışı bırakma - Vani


Page_Load eklemenizden hemen sonra:

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

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

DÜZENLE: Tim aynı şeyi yanıtladı. :) Cevabı da bulabilirsiniz İşte


11
2018-06-14 13:02





Sadece bunu yapmanın başka bir yolunu eklemek istiyorum. Çeşitli ilgili konularda birden çok kişi gördüm. Bunu, ana sayfaya eklemeden VerifyRenderingInServerForm uygulamasını kullanabilirsiniz.

Bunu gerçekten yapabilirsin ama birazcık zor.

İlk önce aşağıdaki gibi bir şey görecek 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*/ }
    }
}

Onunla ilişkili bir .ASPX'in olması gerekmez.

Sonra kontrol etmek istediğinizde, 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şturuldu. Gerekirse, kontrolü tekrar orijinal konumuna ekleyin. Artık HTML'yi oluşturdunuz, sayfa normal ve sayfanın kendisinde bir değişiklik yok.


1
2018-02-23 15:52



Basit bir şey elde etmek için çok fazla kod. - SearchForKnowledge
@DanielEdwards DesignerInitialize () sizin için ne yapar? - JJS


İşte benim 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. */
    }

1
2017-09-02 12:56



Bu cevabı neden cevaplandırıldıktan 5 yıl sonra eklediniz? Ve aynı cevaptır. - Mukus