下午好。
我正在尝试创建一个以两种方式填充的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);
答案 0 :(得分:1)