2012-02-24 38 views
0

我有一个筛选器选择顶部,搜索按钮和ListView与自定义传呼(女巫是一个Repeater女巫包含LinkBut​​tons页码)在底部的网页。asp.net 3.5 ListView

当我选择过滤器并单击搜索按钮时,我将结果放在列表<>和DataBinding它们在ListView。函数witch返回的结果有两个属性StartIndex和PageSize。所以当我点击一个页面时,我再次用新的PageIndex调用函数。有时结果需要ListView中的更多列。 所以我创建了两个类(ResultsLayoutTemplate.cs,ResultsItemTemplate.cs)来设计ListView的布局。

问题是,当我选择一个页面(ListView的自定义页面),结果需要更多列到ListView时,表格的标题不会更改列并保留以前的页面页眉设计。行有正确的列。 例如在第一页ListView有8列,第二页ListView必须有13列。但它为头保留了8列。当第三页需要8列时,也会发生同样的情况。问题只在标题上。

这是代码。

protected void ListView1_LayoutCreated(object sender, EventArgs e) 
{ 
    results = Session["results"] as List<Res>; 
    if (results.Count > 0) 
    { 
     Session["columns"] = results.Max(i => i.columns.Count); 
    } 

    ListView lv = sender as ListView; 
    ListView1.LayoutTemplate = new ResultsLayoutTemplate((int)Session["columns"]); 
    ListView1.ItemTemplate = new ResultsItemTemplate((int)Session["columns"]); 
    ListView1.AlternatingItemTemplate = new AlterResultsItemTemplate((int)Session["columns"]); 

    Control newlayoutContainer = new Control(); 
    lv.LayoutTemplate = new ResultsLayoutTemplate((int)Session["columns"]); 
    lv.LayoutTemplate.InstantiateIn(newlayoutContainer); 

    var usercontrol = newlayoutContainer.Controls[0]; 
    usercontrol.ID = "MyLayout"; 
    lv.Controls.Add(newlayoutContainer); 
} 

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    int num; 
    bool isNum = Int32.TryParse(Session["page"].ToString(), out num); 

    if ((Int32.Parse(Session["page"].ToString()) > 0) && (isNum)) 
    { 
     results = Session["results"] as List<Res>; 
     Session["platos"] = results.Max(i => i.quadruplette.Count); 

     ListView1.Items.Clear(); 
     ListView1.ItemTemplate = new ResultsItemTemplate((int)Session["columns"]); 
     ListView1.AlternatingItemTemplate = new AlterResultsItemTemplate((int)Session["columns"]); 

     ListView1.DataSource = results; 
     ListView1.DataBind(); 
    } 
} 

protected void lbPage_Click(object sender, EventArgs e) 
{ 
    LinkButton btn = sender as LinkButton; 
    int num; 
    bool isNum = Int32.TryParse(btn.Text, out num); 
    if (isNum) 
    { 
     Session["page"] = btn.Text; 
    } 
    results = GetResults(Filters, (Int32.Parse(Session["page"].ToString()) - 1) * PageSize, PageSize); 

     Session["results"] = results; 
     Session["columns"] = results.Max(i => i.columns.Count); 
    } 
} 

回答

0

不是100%确定我明白这个问题,但它听起来像你正试图重新发明轮子。为什么不使用asp.net pagercontrol,只需定义布局以适应您的需求。然后使用与您的筛选器控件绑定的WHERE子句的sqldatasource控件。然后将其绑定到列表视图。然后在单击go按钮时重新绑定sqldatasource。在实际发生绑定之前需要执行的任何特殊操作都可能发生在选择事件中。