【问题标题】:How do you add a Gridview programmatically to an UpdatePanel如何以编程方式将 Gridview 添加到 UpdatePanel
【发布时间】:2012-07-03 14:49:17
【问题描述】:

我不知道如何以编程方式将带有按钮的GridView 添加到UpdatePanel

我可以使用按钮和标签等简单控件来完成此操作,但是当我尝试添加带有按钮的GridView 时,会出现完整的Postback()

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">


protected override void OnInit(EventArgs e)
{
UpdatePanel up1 = new UpdatePanel();
    up1.ID = "UpdatePanel1";



    Button button1 = new Button();
    button1.ID = "Button1";
    button1.Text = "Submit";
    button1.Click += new EventHandler(Button_Click);


    Label label1 = new Label();
    label1.ID = "Label1";
    label1.Text = "A full page postback occurred.";


    GridView gv1 = new GridView();
    //Where the xml gets bonded to the data grind
    XmlDataSource xds = new XmlDataSource();
    xds.Data = xml;
    xds.DataBind();
    xds.EnableCaching = false;

    gv1.DataSource = xds;
    createButton(gv1, up1);
    gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
    gv1.DataBind();




    up1.ChildrenAsTriggers = true;

    up1.ContentTemplateContainer.Controls.Add(button1);
    up1.ContentTemplateContainer.Controls.Add(label1);

    up1.ContentTemplateContainer.Controls.Add(gv1);

    Page.Form.Controls.Add(up1);
}

protected void Page_Load(object sender, EventArgs e)
{


}
public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "buttonClicked")
    {
        int index = Convert.ToInt32(e.CommandArgument);

    }
}

void createButton(GridView g)
{
    ButtonField tea = new ButtonField();
    tea.ButtonType = ButtonType.Image;
    tea.ImageUrl = "~/checkdailyinventory.bmp";
    tea.CommandName = "buttonClicked";
    tea.HeaderText = "space";
    g.Columns.Add(tea);
}

protected void Button_Click(object sender, EventArgs e)
{
    ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
        DateTime.Now.ToString();
}

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>UpdatePanel Constructor Example</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button2" runat="server" Text="Button" />
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
    </div>
    </form>
</body>
</html>

那么,如果单击GridView,如何以编程方式将带有按钮的网格视图添加到UpdatePanel 而不会导致完整的PostBack()

编辑:我尝试过的其他事情

   void gv1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    AsyncPostBackTrigger t = new AsyncPostBackTrigger();
    t.ControlID = e.Row.Cells[0].ClientID;
    t.EventName = "blah";
    up1.Triggers.Add(t);
}

【问题讨论】:

  • 您是否尝试过在页面中包含占位符并将更新面板添加到该占位符,而不是 Page.Controls?
  • 刚刚试过了,没用。 PlaceHolder1.Controls.Clear(); PlaceHolder1.Controls.Add(up1); //Page.Form.Controls.Add(up1);
  • 尝试将 UpdateMode 设置为 UpdatePanelUpdateMode.Conditional。我正在 MSDN 上阅读一些关于这个问题的主题。一个人对 javascript 有问题,这不是你的情况。另一个可以使它与此 UpdateMode 设置一起使用。
  • 将更新模式设置为条件也不起作用。我想我必须将每个按钮添加到触发器中,但我不能 100% 确定如何正确执行。
  • AsyncPostBackTrigger 触发器 = new AsyncPostBackTrigger(); trigger.ControlID = "按钮 ID"; up1.Triggers.Add(触发器);

标签: c# asp.net gridview updatepanel


【解决方案1】:

根据:

而且我不介意在设计时创建更新面板。我只需要能够以编程方式添加东西(比如包含包含按钮的网格视图的表格),然后能够进行部分回发

基本上我用你的代码做了一些小改动:

  • Init 事件中移除绑定并在Load 事件中执行它

  • UpdatePanel 是在设计时使用嵌套面板创建的,您只需将动态控件添加到该面板

这段代码可以做到(它适用于我的环境):

ASPX

    <asp:ScriptManager runat="server" />
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            <asp:Panel runat="server" ID="myPanel">
            </asp:Panel>
            <br />
            <asp:Label runat="server" ID="lblMessage"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>

后面的代码

    protected void Page_Init(object sender, EventArgs e)
    {
        Button button1 = new Button();
        button1.ID = "Button1";
        button1.Text = "Submit";
        button1.Click += new EventHandler(Button_Click);

        Label label1 = new Label();
        label1.ID = "Label1";
        label1.Text = "A full page postback occurred.";

        var s1 = Builder<Product>.CreateListOfSize(15).Build();
        GridView gv1 = new GridView();
        gv1.DataSource = s1;
        createButton(gv1);
        gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);

        this.myPanel.Controls.Add(button1);
        this.myPanel.Controls.Add(label1);
        this.myPanel.Controls.Add(gv1);
    }

    void createButton(GridView g)
    {
        ButtonField tea = new ButtonField();
        tea.ButtonType = ButtonType.Image;
        tea.ImageUrl = "~/checkdailyinventory.bmp";
        tea.CommandName = "buttonClicked";
        tea.HeaderText = "space";
        g.Columns.Add(tea);
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
            DateTime.Now.ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        this.DataBind();
    }

    public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "buttonClicked")
        {
            //int index = Convert.ToInt32(e.CommandArgument);

            this.lblMessage.Text = DateTime.Now.ToString();
        }
    }

输出

【讨论】:

  • 如果我想使用&lt;asp:Table ID="Table1" runat="server"&gt; &lt;/asp:Table&gt;而不是面板会有区别吗?我想将网格视图并排放置。
  • 我认为这会很好,如果您遇到一些问题,您可以动态创建表并将它们添加到Panel
  • 只需几个问题就可以结束这一切。为什么要将绑定添加到 Page_Load?为什么在开始异步之前需要单击两次? (我在做了一些测试后才注意到这一点)我必须在Page_Init 中做吗?或者那是我唯一可以通过编程方式添加 Gridview 的地方?
  • 只需单击一下即可工作,(至少在我发布的代码的环境中)。 Microsoft 的建议是在 Init 事件(使用 MasterPage 时)或 PreInit(不使用 MasterPage 时)中创建动态控件。原因是在这些事件之后创建的控件将在页面生命周期source 的后期引发它们的事件。你实际上可以在Init事件中调用DataBind方法,但是在Load事件中这样做是一个好地方,(在Load中,ViewState已经被绑定了)
  • 顺便说一句,您可以使用:if (!this.IsPostBack) this.DataBind();,因为网格 ViewState 将在每次回发时保留其内容
【解决方案2】:

难道你不能在设计时把 GridView 放在那里,然后通过设置 Visible=false 来隐藏它吗?

如果您不知道需要重复多少个网格视图,则可以将 GridView 包装在 ListView 中。这里引入概念:

这可能不是一个完美的解决方案,我只是想我会提供它,因为我假设你到目前为止已经碰壁了。

【讨论】:

  • 必须以编程方式添加网格视图,因为直到运行时我才知道我需要多少
  • 添加了一个可以涵盖这种情况的额外想法
猜你喜欢
  • 2013-03-09
  • 2011-02-12
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2018-06-19
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多