将表插入转发器内的单个单元中

我正在尝试使用asp.net Repeater构建一个表结构,如下所示:

column 1 | Column 2 Row1 cell1 cell2 --------------------------------------- TABLE 1 TABLE 2 ---------------------------------- col1|Col2|Col3_ same column and rows are here as well Row2 row1____|____|____ row2___ |____|_____ row3____|____|_____ 

但我在第2行添加表1表2时遇到困难。 我不知道如何在Repeater内的单个单元格中添加表格,数据需要从DataTable绑定。

以下是我的Repeater代码:

   
usedcountnotUsedCount
<asp:TextBox runat="server" ID="txtAvai" Text='' ReadOnly="true">
</asp:Repeater

请问任何一个人对这一点有任何想法,我会非常感激吗?

您可以在asp:Repeater控件中嵌套不同的asp.net数据表示控件(例如asp:Repeaterasp:DataListasp:GridViewasp:Table等)。 我添加了一个快速示例,用于创建具有多个Repeater控件的嵌套结构:

.Aspx代码:

   
Column 1 Column 2
T1 Col 1 T1 Col 2
T2 Col 1 T2 Col 2

.Aspx.cs代码:

 DataTable TempDT = new DataTable(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { getData(); } } // create DataTable 3 x 2 public void getData() { TempDT = new DataTable(); TempDT.Columns.Add("Col1"); TempDT.Columns.Add("Col2"); TempDT.Columns.Add("Count"); TempDT.Rows.Add("Temp", "Temp", 100); TempDT.Rows.Add("Temp", "Temp", 100); TempDT.Rows.Add("Temp", "Temp", 100); // store DataTable into ViewState from lost on PostBack ViewState["DT"] = TempDT; RepeaterTable.DataSource = TempDT; RepeaterTable.DataBind(); } // Calls parent Repeater on Binding Data protected void RepeaterTable_ItemDataBound(object sender, RepeaterItemEventArgs e) { // check Repeater item type is not in edit mode if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { DataTable dt = new DataTable(); // get and set DataTable from ViewState dt = ViewState["DT"] as DataTable; Repeater RepeaterTable1 = e.Item.FindControl("RepeaterTable1") as Repeater; Repeater RepeaterTable2 = e.Item.FindControl("RepeaterTable2") as Repeater; RepeaterTable1.DataSource = dt; RepeaterTable1.DataBind(); // calls RepeaterTable1_ItemDataBound event RepeaterTable2.DataSource = dt; RepeaterTable2.DataBind(); // // calls RepeaterTable2_ItemDataBound event Panel PanelTextBoxes = e.Item.FindControl("PanelTextBoxes") as Panel; Panel PanelTables = e.Item.FindControl("PanelTables") as Panel; // show only first structure if (e.Item.ItemIndex != 0) { PanelTextBoxes.Visible = false; PanelTables.Visible = false; } } } // Calls child Repeater on Binding Data protected void RepeaterTable1_ItemDataBound(object sender, RepeaterItemEventArgs e) { // check Repeater item type is not in edit mode if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { //.. here is code when child repeater is binding } } // Calls child Repeater on Binding Data protected void RepeaterTable2_ItemDataBound(object sender, RepeaterItemEventArgs e) { // check Repeater item type is not in edit mode if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { //.. here is code when child repeater is binding } } 

演示图像是:

在此处输入图像描述

更新:

如果您不想重复整个结构,那么只需在RepeaterTable_ItemDataBound事件中添加以下代码:

 Panel PanelTextBoxes = e.Item.FindControl("PanelTextBoxes") as Panel; Panel PanelTables = e.Item.FindControl("PanelTables") as Panel; if (e.Item.ItemIndex != 0) { PanelTextBoxes.Visible = false; PanelTables.Visible = false; } 

不重复整个结构图像演示:

在此处输入图像描述

为什么要在转发器的第二项中添加两个表呢? 它不需要Repeater == Table

相反,在转发器的放置主表的第一行,第二行包含您想要的所有2个表。 然后为其余行保留转发器的 (从第3行向下)

您可以通过后面的代码访问这两个表,或使用属性或Eval设置值

以下是你的.aspx看起来的样子:(我为转发器添加了XmlDataSource1只是为了使绑定工作,我还使用了属性<%= this.ContentString %>我将在后面的代码中声明和设置)

     <%--------Your Master Table--------%>  <%-- Closing the second row of master table --%> <%-- Everything is completed in the repeater's header! --%> 
usedcount notUsedCount
Row1 Cell1 Row1 Cell2
<%----------------First Inner Table------------------%> Header Header <%---Add your conents as properties----%> <%= this.ContentString %> content content content content <%----------------Second Inner Table------------------%> Header Header <%---Add your conents as properties----%> <%= this.ContentString %> content content content content
<%--continue master table as usual--%>

这是后面的代码,注意属性ContentString 。 以及如何在绑定转发器后访问第2行的表:

  public partial class _Default : Page { private string strContent; // notice the property that the tables can read as in the aspx code above public String ContentString { get { return strContent; } } protected void Page_Load(object sender, EventArgs e) { strContent = "Your Content"; Repeaterp.DataBind(); // here's how to access the two tables Table Table1 = (Table)Repeaterp.Controls[0].FindControl("Table1"); Table Table2 = (Table)Repeaterp.Controls[0].FindControl("Table2"); } } 

如果您真的想在转发器的第二行中有一个表,则可以执行以下操作。

将两个PlaceHolder添加到ItemTemplate 。 一个用于表格的第二行,另一个用于其他行。 在ItemIndex上设置其可见性基础。 请注意,使用GridViews因为它们成为HTML中的表格元素。

                         

如果你想要第3行再次成为那2个文本框然后第4行表格等,请在PlaceHolder的visible属性中使用Container.ItemIndex % 2 == 0Container.ItemIndex % 2 == 1 ,因为上面的演示假设在Repeater中只有2行。

接下来,将OnItemDataBound事件添加到Repeater。

  

然后在代码后面查看绑定的项是否是第二行,找到GridView并将数据绑定到它们。 我为这个演示创建了一个虚拟DataTable ,但您可以在Repeaterp_ItemDataBound方法中将任何源绑定到它们

 protected void Repeaterp_ItemDataBound(object sender, RepeaterItemEventArgs e) { //check if it is the second row if (e.Item.ItemIndex == 1) { //find the gridviews in the repeater item using findcontrol GridView gv1 = e.Item.FindControl("GridView1") as GridView; GridView gv2 = e.Item.FindControl("GridView2") as GridView; //create a dummy datatable for this demo DataTable table = new DataTable(); table.Columns.Add("Col1", typeof(int)); table.Columns.Add("Col2", typeof(string)); table.Columns.Add("Col3", typeof(string)); //add some rows to the table table.Rows.Add(0, "Row 1", "AAA"); table.Rows.Add(1, "Row 2", "BBB"); table.Rows.Add(2, "Row 3", "CCC"); //bind the data to the gridviews in the second row gv1.DataSource = table; gv2.DataSource = table; gv1.DataBind(); gv2.DataBind(); } } 

这些天我会忙着给你逻辑怎么做而不是编码。

1)将ItemDataBound事件添加到您的父转发器(假设id =“parentrepeater”。

2)在aspx文件中的转发器itemtemplate中添加子转发器(假设id =“childrepeater”。

3)在父级的转发器ItemDataBound中,找到您的子转发器并绑定数据源。

 protected void parent_ItemDataBound(object sender, RepeaterItemEventArgs e) { // check Repeater item type is not in edit mode if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater childRepeater = e.Item.FindControl("childrepeater") as Repeater; childRepeater.DataSource = "Get Your Datasource here"; childRepeater.DataBind(); } } 

使用此方法,您可以实现无限制的多级嵌套转发器。