0

我正在构建一个 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 (...)

有谁知道这是什么原因?

4

1 回答 1

1

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

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

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

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

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

于 2012-05-04T21:40:55.347 回答