2015-05-09 78 views
0

我有一个要求,添加一个包含用户控件(文本框)+ 2 Gridviews的面板和他们自己的项目模板+在这些控件上运行的其他验证,在Web窗体上动态地由按钮点击产生。所以每当用户点击一个按钮“添加面板”时,就会产生一个新的面板和上面的控件。在按钮上添加动态控件(控件集)点击

我正在尝试数据列表和中继器的路由,但将数据绑定到上述控件正成为一项挑战。我想在未来之前调查其他领域来实现这一目标。

任何帮助,链接,建议或指针,将不胜感激?

回答

1

只是为了让你开始。

  • 用户控件:DynamicUC.ascx
  • 页使用该用户控制:DynamicPage.aspx

DyanamicUC.ascx

<div style="float: left"> 
    <asp:TextBox ID="tbMyTextBox" runat="server" /> 

    <asp:GridView runat="server" ID="gvNumbers" AutoGenerateColumns="False"> 
     <Columns> 
      <asp:BoundField DataField="Serial" HeaderText="Seiral" /> 
      <asp:TemplateField HeaderText="Item Name"> 
       <ItemTemplate> 
        <%# Eval("Item") %> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

</div> 

DynamicUC.ascx.cs

public partial class DynamicUC : UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     public void PopulateData(string value) 
     { 
      tbMyTextBox.Text = value; 
      gvNumbers.DataSource = Enumerable.Range(1, 5).Select(i => new { Serial = i, Item = "Item " + i }); 
      gvNumbers.DataBind(); 
     } 

     public string GetData() 
     { 
      return Server.HtmlEncode(tbMyTextBox.Text); 
     } 
    } 

DynamicPage.aspx

<asp:Button ID="btnAddUC" Text="Add UC" runat="server" OnClick="btnAddUC_Click" /> 
<asp:Button ID="btnGetUCValues" Text="Get UC Values" runat="server" OnClick="btnGetUCValues_Click" /> 

<asp:Panel runat="server" ID="pnlDynamicUCPanel" Style="overflow: auto;"> 
</asp:Panel> 
<asp:Label ID="lblUCValues" runat="server" Style="clear: both;" /> 

DynamicPage.aspx.cs

public partial class DynamicPage : System.Web.UI.Page 
{ 
    private int NumberOfDynamicControls 
    { 
     get 
     { 
      var numberOfDynamicControls = ViewState["__dynamicUCCount"]; 
      if (numberOfDynamicControls != null) 
      { 
       return (int)numberOfDynamicControls; 
      } 
      return 0; 
     } 
     set 
     { 
      ViewState["__dynamicUCCount"] = value; 
     } 
    } 
    private List<DynamicUC> _dynamicUCList; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     RestoreDynamicUC(); 
    } 

    protected void btnAddUC_Click(object sender, EventArgs e) 
    { 
     CreateDyanamicUC(NumberOfDynamicControls); 
     NumberOfDynamicControls++; 
    } 

    private void RestoreDynamicUC() 
    { 
     if (NumberOfDynamicControls == 0) 
      return; 
     for (int i = 0; i < NumberOfDynamicControls; i++) 
     { 
      CreateDyanamicUC(i); 
     } 
    } 

    private void CreateDyanamicUC(int dataIndex) 
    { 
     if (_dynamicUCList == null) 
     { 
      _dynamicUCList = new List<DynamicUC>(); 
     } 
     var dynamicUC = LoadControl("DynamicUC.ascx") as DynamicUC; 
     dynamicUC.PopulateData("Data " + dataIndex); 
     pnlDynamicUCPanel.Controls.Add(dynamicUC); 
     _dynamicUCList.Add(dynamicUC); 
    } 

    protected void btnGetUCValues_Click(object sender, EventArgs e) 
    { 
     var valuesText = ""; 
     if (_dynamicUCList != null) 
     { 
      valuesText = string.Join(", ", _dynamicUCList.Select(duc => duc.GetData())); 
     } 
     lblUCValues.Text = "UC Values: " + valuesText; 
    } 
} 

有很多解释;但我恐怕没有多少时间。但是这应该给一些提示。