代码之家  ›  专栏  ›  技术社区  ›  Bob Tway

中继器数据绑定在回发时丢失数据和事件-是否有最佳实践解决方案?

  •  1
  • Bob Tway  · 技术社区  · 14 年前

    目前正在努力解决一个问题,我遇到的变化,在过去。目前,一个有价值的解决方案让我不知所措,但这似乎是一个显而易见的问题,我不禁想知道是否有一个“最佳实践”的方法,我应该采取。

    如果没有代码,简而言之,问题如下:

    • 页面具有数据绑定控件(中继器),在用户输入数据并单击按钮之前不会填充该控件。
    • 重复项模板包含一个按钮
    • 回到悲惨循环的开始

    马特

    2 回复  |  直到 14 年前
        1
  •  2
  •   ChrisLively    14 年前

    如果任何控件是动态创建的,则必须在回发期间重新创建它们,以便事件等连接起来。

    如果是这样,看看 control built by a guy named Denis Bauer

        2
  •  2
  •   Andy Rose    14 年前

    如果事件是由中继器中的按钮触发的,那么这将冒泡到中继器ItemCommand事件。然后,使用buttons CommandName和CommandArgument参数可以确定单击了哪个按钮并相应地执行操作。下面是一些基本的标记和代码以演示该方法:

    <asp:Repeater ID="rptTest" runat="server" onitemcommand="rptTest_ItemCommand" 
        onitemdatabound="rptTest_ItemDataBound">
        <ItemTemplate>
            <p>
                <asp:Button ID="btnTest" runat="server" />
            </p>
        </ItemTemplate>
    </asp:Repeater>
    <asp:Button ID="btnLoad" runat="server" Text="Load" onclick="btnLoad_Click" />
    

    事件背后的代码:

    protected void rptTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
    
        Button button = (Button)e.Item.FindControl("btnTest");
        button.Text = string.Format("Button {0}", e.Item.DataItem.ToString());
        button.CommandName = e.Item.ItemIndex.ToString();
    }
    
    protected void rptTest_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        Response.Write(string.Format("Postback from button {0}", e.CommandName));
    }
    
    protected void btnLoad_Click(object sender, EventArgs e)
    {
        List<int> list = new List<int>();
        list.Add(1);
        list.Add(2);
        list.Add(3);
        list.Add(4);
        rptTest.DataSource = list;
        rptTest.DataBind();
    }
    

    希望我已经理解了这个问题,这对我有帮助。