【发布时间】:2012-02-24 13:42:54
【问题描述】:
我有一个顶部带有过滤器选择的网页、一个搜索按钮和一个底部带有自定义寻呼机的 ListView(女巫是一个中继器女巫,其中包含带有页码的 LinkButtons)。
当我选择过滤器并单击搜索按钮时,我将结果放入 List 并在 ListView 中对它们进行数据绑定。返回结果的函数有两个属性,分别是 StartIndex 和 PageSize。因此,当我单击一个页面时,我会再次使用新的 PageIndex 调用该函数。有时结果需要来自 ListView 的更多列。 所以我创建了两个类(ResultsLayoutTemplate.cs、ResultsItemTemplate.cs)来设计ListView的布局。
问题是当我选择一个页面(ListView 的自定义分页器)时,结果需要更多列到 ListView,表的标题不会更改列并保持前一页标题设计。行有正确的列。 例如,第一页 ListView 有 8 列,第二页 ListView 必须有 13 列。但它为标题保留了 8 列。当第三页需要 8 列时也会发生同样的情况,它从上一页显示为 13。问题只是在标题上。
这是代码。
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);
}
}
【问题讨论】: