ListControl.DataBind()无法按预期工作

时间:2011-05-20 09:21:54

标签: c# asp.net

我遇到了问题。我有一个动态创建控件的ASP.NET项目。更多的控件依赖于另一个控件(在回发上),因此它们可以改变它们的外观。

我有ListControl并用一种方法将其与数据绑定:

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();
    }
}

传入的dataSource是好的(正如业务逻辑所预期的那样),但渲染列表控件自上一个BindList以来没有改变。因此,在后面的数据绑定之后,第一个数据绑定(使用默认dataSource)之后的问题列表控制不会改变。

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");        
     }
}

修复:解决方案:我认为问题是在OnInit之后发生了LoadViewState,并且它使用存储在ViewState中的先前数据覆盖了ListControl。所以我已经从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;
    }
}

3 个答案:

答案 0 :(得分: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"));    
    }

答案 1 :(得分:0)

我认为你绑定PostBack上的列表,数据源没有任何值,所以在调用方法时确保数据源有一些价值。

答案 2 :(得分:0)

您可以尝试页面活动PreRender
ASP.NET Page Life Cycle Overview

  

在Page对象之后引发   创建了所需的所有控件   为了呈现页面,包括   复合控制的子控件。