我被问题缠住了。我有一个具有动态创建控件的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");
}
}修复:解决方案:我认为问题在于LoadViewState发生在OnInit之后,它用存储在ViewState中的以前的数据覆盖ListControl。因此,我已经将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;
}
}发布于 2011-05-20 09:33:21
我建议将绑定代码移动到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"));
}发布于 2011-05-20 09:45:33
我认为您正在将列表绑定到PostBack上,其中的Datasource没有值,所以请确保数据源在调用方法时具有一定的价值。
发布于 2011-05-20 10:06:45
您可以尝试页面的PreRender事件。
ASP.NET页面生命周期概述
在page对象创建了呈现页面所需的所有控件(包括复合控件的子控件)后引发。
https://stackoverflow.com/questions/6069872
复制相似问题