我遇到了问题。我有一个动态创建控件的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;
}
}
答案 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对象之后引发 创建了所需的所有控件 为了呈现页面,包括 复合控制的子控件。