2012-02-24 18 views
0

私は、上部にあるフィルタ選択、検索ボタン、およびカスタムページャ(リストはページ番号のLinkBut​​tonを含む魔法使い)を持つリストビューを持つWebページを持っています。asp.net 3.5 ListView

フィルタを選択して検索ボタンをクリックすると、リスト<>に結果が格納され、ListViewにデータがバインドされます。関数witchが返す結果には、StartIndexとPageSizeの2つのプロパティがあります。ページをクリックすると、新しいPageIndexで関数が呼び出されます。場合によっては、結果にListViewの列が必要になることがあります。 したがって、ListViewのレイアウトを設計する2つのクラス(ResultsLayoutTemplate.cs、ResultsItemTemplate.cs)を作成します。

問題は、ListViewのカスタムページャを選択したときに結果がListViewに多くの列が必要な場合です。テーブルのヘッダーは列を変更せず、前のページヘッダーのデザインを保持します。行には右の列があります。 たとえば、最初のページのListViewには8列あり、2番目のページにはListViewに13列が必要です。しかし、それはヘッダーのために8列を保持します。第3ページに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); 
    } 
} 

答えて

0

私はこの質問をよく理解していませんが、あなたは車輪を再発明しようとしているようです。なぜasp.net pagercontrolを使用せず、必要なものに合わせてレイアウトを定義してください。次に、フィルタコントロールにバインドされたWHERE句でsqldatasourceコントロールを使用します。次に、それをリストビューにバインドします。次に、[移動]ボタンをクリックすると、sqldatasourceが再バインドされます。実際にバインドされる前に実行する必要のある特別な操作は、Selectingイベントで発生する可能性があります。