2011-05-20 60 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对象具有 创建所需 为了渲染页面的所有控件,包括复合控件的 子控件后。