2011-05-20 56 views
0

我一直在問題。我有一個動態創建控件的ASP.NET項目。更多的控件依賴於另一個控件(在回發中),因此它們可以改變它們的外觀。ListControl.DataBind()不按預期方式工作

我有列表控件和數據綁定它一個方法:

public static class ListControlExtensions 
{ 
    public static void BindList(this ListControl list, IEnumerable dataSource, string valueKey, string textKey) 
    { 
     list.Items.Clear(); 
     list.Items.Add(new ListItem("(Empty)", "-1")); 

     list.AppendDataBoundItems = true; 
     list.DataSource = dataSource; 
     list.DataValueField = valueKey; 
     list.DataTextField = textKey; 
     list.DataBind(); 
    } 
} 

傳入的數據源是很好的(如預期由於業務邏輯),但呈現的列表控制從去年的BindList沒有改變。因此,在第一次數據綁定之後,使用缺省數據源的問題列表控件不會改變。

的BindList調用在OnInit中:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 

    if (CompaniesList != null) 
    { 
     BindCompaniesList(CompaniesList, valueToFilter); 
    } 
} 

protected void BindCompaniesList(ListControl listToBind, String valueToFilter) 
{ 
    if (listToBind != null) 
    { 
     var list = Helper.GetCompanies(); 
     foreach (var item in list.Where(item => item.Value == valueToFilter)) 
     { 
      item.Value = "-1"; 
     } 
     listToBind.BindList(list, "Value", "Text");   
    } 
} 

固定:解決辦法:我認爲問題是,LoadViewState的OnInit後會發生,它會覆蓋之前的數據,存儲在ViewState中的列表控件。所以我已經從OnInit中將DataBind移動到了OnLoad,並緩存了選定的值,因爲綁定重置了它。

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    if (CompaniesList != null) 
    { 
     var selected = CompaniesList.SelectedIndex; 
     BindCompaniesList(CompaniesList, valueToFilter); 
     CompaniesList.SelectedIndex = selected; 
    } 
} 
+0

你的意思只是第一次你的清單綁定,但不是在回發? – jams 2011-05-20 09:47:42

+0

我每次綁定時,加載控件 - 但我認爲問題是,LoadViewState發生在OnInit之後,它用存儲在ViewState中的先前數據覆蓋ListControl。所以我已經將綁定移動到OnLoad – ajukraine 2011-05-20 09:57:15

回答

1

我建議移動綁定代碼onload事件,並根據您的代碼是如何工作的,應該是這個樣子

if (!Page.IsPostBack()) 
{ 
     if (CompaniesList != null)  
     {   BindCompaniesList(CompaniesList, valueToFilter);  } 
} 

另外,在綁定代碼我會建議嘗試

public static void BindList(this ListControl list, IEnumerable dataSource, string valueKey, string textKey)   
{ 
     list.DataSource = dataSource; 
     list.DataValueField = valueKey; 
     list.DataTextField = textKey; 
     list.DataBind(); 
     list.Insert(0, new ListItem("(Empty)", "-1"));  
    } 
+0

我無法將綁定放入!IsPostBack,因爲我必須在PostBack中創建數據綁定列表。 – ajukraine 2011-05-20 09:36:08

+0

如果我把它放在OnLoad它不會保存選定的項目... – ajukraine 2011-05-20 09:41:33

0

我認爲你綁定了PostBack上的列表,其中數據源沒有任何值,所以請確保數據源在調用方法時具有某些值。

+0

數據源充滿了正確的項目,正如我所說。我認爲,問題是關於ListControl的ViewState。在@Andrew建議之後,我已經將綁定移動到Load事件中 - 並且它現在正確填充了listcontrol,但沒有保存選定的值。所以我提出瞭解決方案,在我的文章中更新。 – ajukraine 2011-05-20 09:50:00

+0

@ajukraine感謝您的更新。 – Maxymus 2011-05-20 10:00:19

0

您可以嘗試PreRender事件頁面。
ASP.NET Page Life Cycle Overview

募集Page對象具有 創建所需 爲了渲染頁面的所有控件,包括複合控件的 子控件後。