【发布时间】:2011-05-20 09:21:54
【问题描述】:
我遇到了问题。我有一个动态创建控件的 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 以来没有改变。所以问题 - 第一个数据绑定后的列表控件(使用默认数据源)在以后的数据绑定后不会改变。
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");
}
}
FIXED: 解决方案:我认为问题是 LoadViewState 发生在 OnInit 之后,它用以前的数据覆盖 ListControl,存储在 ViewState 中。因此,我将 DataBind 从 OnInit 移至 OnLoad,并缓存了选定的值,因为绑定会重置它。
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (CompaniesList != null)
{
var selected = CompaniesList.SelectedIndex;
BindCompaniesList(CompaniesList, valueToFilter);
CompaniesList.SelectedIndex = selected;
}
}
【问题讨论】:
-
您的意思是您的列表仅在第一次被绑定而不是在回发时?
-
我每次在加载控件时都绑定 - 但我认为问题是 LoadViewState 发生在 OnInit 之后,它用以前的数据覆盖 ListControl,存储在 ViewState 中。所以我把绑定移到了 OnLoad