我要创建动态文本框的数量(在下拉列表中选择的值,范围从1到5)
注意:下拉列表列表也是动态创建的控件
这里的示例代码:
Table table=new Table();
for (int i = 1; i <= 5; i++)
{
TableRow row = new TableRow();
TableCell cell = new TableCell();
DropDownList drp_splzn = new DropDownList();
drp_splzn.ID = i.ToString();
drp_splzn.Items.Add("-SELECT SPECIALIZATION-");
drp_splzn.Items.Add(new ListItem("1", "1"));
drp_splzn.Items.Add(new ListItem("2", "2"));
drp_splzn.Items.Add(new ListItem("3", "3"));
drp_splzn.Items.Add(new ListItem("4", "4"));
drp_splzn.Items.Add(new ListItem("5", "5"));
cell.Controls.Add(drp_splzn);
row.Cells.Add(cell);
table.Rows.Add(row);
}
我希望先创建文本框,然后再添加受尊重的下拉列表...我知道可以使用回发和下拉列表更改事件...但是我无法弄清楚
这是解决最终问题的方法。
下图是说明(您可以更改文本框的内容,并且新值将在回发之间保留):
现在,我们面临着保持已经显示的文本框 displayed
以及保持它们所保存的值的需求。Ť他关键在做,这是使用ViewState的对象。我们将通过在希望其状态保持不变的每个控件上启用它来做到这一点。另一方面,ASP .NET的引擎不会为我们重新创建控件,但是当控件可用时,它将对它们使用ViewState机制。
因此,首先让我们创建一个Dictionary对象。我们将使用它来保存两个信息。第一个是used
下拉列表,第二个是selected value on that dropdownlist
。我们将其创建为静态变量,就像我们执行布尔hasDropDowns一样
public partial class WebForm1 : System.Web.UI.Page
{
static bool hasDropDowns = false;
static Dictionary<int, int> textBoxesStateDictionnary = new Dictionary<int, int>();
...
我们将使用下拉列表的ID作为键,并将该下拉列表中的选定值用作关联值。
然后,我们需要更改选择索引已更改的事件处理程序。选择一个值并创建文本框后,我们需要在字典中添加一个新条目。这是selectindex更改事件处理程序的新版本
void drp_splzn_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList chosenDropDown = (DropDownList)sender;
Int32 pickedValue = Int32.Parse(chosenDropDown.SelectedValue);
Table table = // new Table();
(Table)Page.Form.FindControl("table" + chosenDropDown.ID);
for (int i = 0; i < pickedValue; i++)
{
TableRow row = new TableRow();
TableCell cell = new TableCell();
cell.Attributes.Add("runat", "server");
TextBox txt_splzn = new TextBox();
txt_splzn.ID = "txtB_" + chosenDropDown.ID + "_" + i.ToString();
txt_splzn.Text = "Text Number " + i.ToString();
txt_splzn.EnableViewState = true;
cell.Controls.Add(txt_splzn);
row.Cells.Add(cell);
table.Rows.Add(row);
}
textBoxesStateDictionnary.Add(Int32.Parse(chosenDropDown.ID), Int32.Parse(chosenDropDown.SelectedValue));
}
正如您在代码的最后一行中看到的那样,键是所选下拉列表的ID和对应的值(即所选值)。
此外,由于先前的ID由乱扔垃圾和选定的值组成,因此我们还必须更改文本框ID。如果我们保持不变,则Page.Form.FindControl方法将引发异常:ID将是唯一的。
现在我们需要影响Page_Load事件处理程序。在我们重新创建一个下拉列表之后,我们立即查看字典以查看是否存在相应的条目(使用其ID)。如果存在,我们将重新创建字典条目中相应值所指示的文本框。然后,我们信任ViewState来执行此操作,因为创建文本框时,我们激活了ViewState(请参阅参考资料txt_splzn.EnableViewState = true;
)
这是Page_Load事件处理程序的代码
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
if (!hasDropDowns)
{
return;
}
Table table = new Table();
for (int i = 1; i <= 5; i++)
{
TableRow row = new TableRow();
TableCell cell = new TableCell();
cell.Attributes.Add("runat", "server");
DropDownList drp_splzn = new DropDownList();
drp_splzn.ID = i.ToString();
drp_splzn.Items.Add("-SELECT SPECIALIZATION-");
drp_splzn.Items.Add(new ListItem("1", "1"));
drp_splzn.Items.Add(new ListItem("2", "2"));
drp_splzn.Items.Add(new ListItem("3", "3"));
drp_splzn.Items.Add(new ListItem("4", "4"));
drp_splzn.Items.Add(new ListItem("5", "5"));
drp_splzn.SelectedIndexChanged += drp_splzn_SelectedIndexChanged;
drp_splzn.AutoPostBack = true;
drp_splzn.EnableViewState = true;
cell.Controls.Add(drp_splzn);
row.Cells.Add(cell);
table.Rows.Add(row);
TableRow rowT = new TableRow();
TableCell cellT = new TableCell();
cellT.Attributes.Add("runat", "server");
Table table2 = new Table();
table2.ID = "table" + i.ToString();
int retrievedValue = -1;
if (textBoxesStateDictionnary.TryGetValue(i, out retrievedValue))
{
for (int j = 0; j < retrievedValue; j++)
{
// Recreate them
TableRow rowTT = new TableRow();
TableCell cellTT = new TableCell();
cellTT.Attributes.Add("runat", "server");
TextBox txt_splzn = new TextBox();
txt_splzn.ID = "txtB_" + i +"_" + j.ToString();
txt_splzn.EnableViewState = true;
cellTT.Controls.Add(txt_splzn);
rowTT.Controls.Add(cellTT);
table2.Controls.Add(rowTT);
}
}
cellT.Controls.Add(table2);
rowT.Cells.Add(cellT);
table.Rows.Add(rowT);
}
this.Controls.Add(table);
Page.Form.Controls.Add(table);
}
else
{
}
}
就是这样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句