具有动态DropDownList和回发的ASP生命周期

时间:2016-09-15 12:16:09

标签: c# asp.net lifecycle

下午好。

我正在尝试创建一个以两种方式填充的DropDownList:

  • 选项来自枚举,列出了每个可能的选项。
  • 所选值来自数据库表。

DropDownList的SelectedIndexChanged负责为我更新数据库。

请注意,控件已经正常工作,但我认为我没有正确理解生命周期,并希望得到一些澄清。

  • 在PageInit上,我生成一个带有标题的表和一个带有我的DropDownList的单元格。

        //Essentially an ArrayList with "row" information (it uses a Field class with
        //several parameters, each corresponding to 1 column in the table
        GenericFieldsCollection data = new GenericFieldsCollection();
        data.FillFieldList();
    
        Table TableToEdit = new Table();
    
        TableHeaderCell Header_FieldName = new TableHeaderCell();
        (...)
    
        foreach (GenericField row in data.FieldList)
        {
        (...)
        //The cell with the DDL:
        TableCell Column_GraphName = new TableCell();
        Column_GraphName.Controls.Add(GenerateGraphSelectionDropdown());
        (...)
        }
    

显然,如果我不在这里生成,Click事件就不会起作用。

  • 此过程仅使用Select查询数据库,不进行更新。

  • 在第一次(!PostBack)调用之后,可以通过更改DropDownList的索引(它具有AutoPostBack = true)来触发后续调用。

  • 所以,我的PageInit再次运行,正如预期的那样。并且,在加载Number 15 in here happens之后( OnXXX(控制事件)),我的数据库得到更新。

  • 稍后在Cycle(OnPreRender)中,我尝试清除Div锚点我使用所有控件的表格,并再次调用我的GenerateFieldCollectionTable()。,因为我的在我的DropDownList的SelectedIndexChanged事件已经执行中更新查询,我希望看到更新的值。但是,执行此操作将显示旧值,并破坏行为(我无法更改任何内容,并且数据库中没有任何更改)。

经过一些测试后,我发现有这一行的Page_PreRender是个问题:

        ------> //TableToEditGraphFields.Controls.Clear();
        GenerateFieldCollectionTable();

清除TableToEditGraphFields的控件, AFTER CLICK EVENTS 后发生的操作(从那时起) Control.OnPreRender是#22而OnSelectedIndexChanged是#15),意味着在下一个PostBack上,控件不会触发点击事件,因为它们已被清除。是否有循环的一部分,我可以处理Click事件,重建控件,并仍然可以在下一个PostBack上点击它们?

提前谢谢。

编辑:生成表格的代码:

            GenericFieldsCollection data = new GenericFieldsCollection();
        data.FillFieldList();

        Table TableToEdit = new Table();

        TableToEdit.CssClass = "table";

        TableRow Headers = new TableRow();

        TableHeaderCell Header_FieldName = new TableHeaderCell();
        Header_FieldName.Text = "Field Name";
        Headers.Cells.Add(Header_FieldName);

        //Repeat for each header

        TableToEdit.Rows.Add(Headers);

        foreach (GenericField row in data.FieldList)
        {

            TableRow currentRow = new TableRow();

            //Repeat for each column; example with the "Order" column

            TableCell Column_Order = new TableCell();

            TextBox editableOrder = new TextBox();
            editableOrder.Attributes.Add("FieldName", row.Name);
            editableOrder.Attributes.Add("FieldTable", row.Table);
            editableOrder.AutoPostBack = true;
            editableOrder.TextChanged += EditableOrder_TextChanged;
            editableOrder.Text = row.Order.ToString();
            Column_Order.Controls.Add(editableOrder);

            currentRow.Cells.Add(Column_Order);

            TableToEdit.Rows.Add(currentRow);
        }

        TableToEditGraphFields.Controls.Add(TableToEdit);

1 个答案:

答案 0 :(得分:1)

"我没有正确理解生命周期,并希望得到一些澄清。"

生命周期如何运作?

如下图所示。这就是生命周期的运作方式。 所有信息均来自codedisplay。您可以阅读更多信息。

enter image description here