首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListControl.DataBind()不像预期的那样工作

ListControl.DataBind()不像预期的那样工作
EN

Stack Overflow用户
提问于 2011-05-20 09:21:54
回答 3查看 493关注 0票数 0

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

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中的以前的数据覆盖ListControl。因此,我已经将DataBind从OnInit移到OnLoad,并缓存了所选的值,因为绑定会重置它。

代码语言:javascript
复制
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-20 09:33:21

我建议将绑定代码移动到OnLoad,根据代码的工作方式,它应该如下所示

代码语言:javascript
复制
if (!Page.IsPostBack())
{
      if (CompaniesList != null)      
      {          BindCompaniesList(CompaniesList, valueToFilter);      }
}

同样在绑定代码中,我建议尝试

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-05-20 09:45:33

我认为您正在将列表绑定到PostBack上,其中的Datasource没有值,所以请确保数据源在调用方法时具有一定的价值。

票数 0
EN

Stack Overflow用户

发布于 2011-05-20 10:06:45

您可以尝试页面的PreRender事件。

ASP.NET页面生命周期概述

在page对象创建了呈现页面所需的所有控件(包括复合控件的子控件)后引发。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6069872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档