第一遍没有项目的ListView

时间:2012-05-04 21:07:24

标签: asp.net linq

我正在构建一个ASP.NET应用程序。我正在使用ListView来显示一些实体,但是我的listview在第一次传递时没有项目。我的意思是,它们会显示在页面上,但只有当我刷新页面时,此代码才有效:

protected void Page_Load(object sender, EventArgs e)
{
    fillFeatures();
}

private void fillFeatures()
{
    using (Entities myEntities = new Entities())
    {
        System.Diagnostics.Debug.Write("Filling features.. \n");
        foreach (ListViewItem item in ListView1.Items)
        {
            System.Diagnostics.Debug.Write("FOR \n");
            CheckBox checkbox = (CheckBox)item.FindControl("Checkbox");
            TextBox description = (TextBox)item.FindControl("descriptionTextbox");

            //Try to get an existing relation
            int featureId = Int32.Parse(((Label)item.FindControl("idLabel")).Text);

            PlaceHasFeature phf = (from p in myEntities.PlaceHasFeature
                                   where p.place_id == placeId && p.feature_id == featureId
                                   select p).SingleOrDefault();

            if (phf != null)
            {
                System.Diagnostics.Debug.Write("Checking " + phf.Feature.name + "\n");
                //Relation exists
                checkbox.Checked = true;
                description.Text = phf.description;
            }
            else
            {
                System.Diagnostics.Debug.Write("Didn't find relation for " + featureId + "\n");
            }
        }
    }
}

控制台输出:

当我打开链接时:填充功能......

刷新后:填充功能... FOR FOR FOR(...)

任何人都知道原因吗?

1 个答案:

答案 0 :(得分:1)

我怀疑问题是由ASP.NET Page Life Cycle导致的,其中页面加载事件发生在单个控件加载事件之前:

  

Page对象调用Page对象上的OnLoad方法,然后   递归地为每个子控件执行相同的操作,直到页面和   所有控件都已加载。发生单个控件的Load事件   在页面的Load事件之后。

我相信你有几个选择。将fillFeatures方法移至Page.LoadComplete Event

  

LoadComplete事件发生在所有回发数据和视图状态之后   数据加载到页面中,并在OnLoad方法之后   要求页面上的所有控件。

或者将fillFeatures方法移动到ListBox的DataBound Event。虽然我怀疑Page.LoadComplete Event确实是两个选项中的更好。