日期:2014-05-17  浏览次数:20417 次

求救Repeater动态列显示的一个问题
前台:
<asp:Repeater ID="Repeater1" runat="server" EnableViewState="false"  
OnItemDataBound="Repeater1_ItemDataBound">
<headerTemplate>  
<asp:Literal ID="lit_head" runat="server"></asp:Literal>
</headertemplate>  
<itemtemplate>  
<asp:Literal ID="lit_item" runat="server"></asp:Literal>
</itemtemplate>  
</asp:Repeater>

后台:
private static DataTable dt = new DataTable();//全局变量
protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
  {  
  this.Repeater1.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.Repeater1_ItemDataBound);
  this.Repeater1.DataSource = 已经取出来的datatable
  this.Repeater1.DataBind();
  dt = ExecDataTable(querySql);
  }
}

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  StringBuilder sb = new StringBuilder();
  if (e.Item.ItemType == ListItemType.Header)
  {
  sb.Append("<tr>");
  foreach (DataColumn col in dt.Columns)
  {
  sb.AppendFormat("<td>{0}</td>", col.ColumnName);//取出列名
  }
  sb.Append("</tr>");
  Literal literal = (Literal)e.Item.FindControl("lit_head");
  literal.Text = sb.ToString();
  }
  else if (e.Item.ItemType == ListItemType.Item)
  {
  for (int i = 0; i < dt.Rows.Count; i++)
  {
  sb.Append("<tr>");
  for (int j = 0; j < dt.Columns.Count; j++)
  {
  sb.AppendFormat("<td class=\"dxgv\">{0}</td>", dt.Rows[i][j]);
  }
  sb.Append("</tr>");
  }
  Literal liter = (Literal)e.Item.FindControl("lit_item");
  liter.Text = sb.ToString();
  }}

-------------------------
代码如上,现在的问题是我在repeater的Repeater1_ItemDataBound事件里,绑定值的时候发现ListItemType.Header的列头部分是显示一行的,但是item部分不断的循环,将查出的liter.Text 循环了多次!所以我在界面上显示的数据重复了多遍。
我想问的是我的代码出错在哪里了?


------解决方案--------------------
去掉这个 this.Repeater1.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.Repeater1_ItemDataBound);试试
------解决方案--------------------
看下这个文章,希望对你有帮助
http://blog.csdn.net/hj850126/article/details/7483077
------解决方案--------------------
我知道问题在哪里,你这个事件Repeater1_ItemDataBound 是这样工作的,
每从datatable取出一行数据,它就启动一次。而你的代码会启动这个事件很多次,所以......