前段时间在WEBFORM中要实现产品的动态和产品的模块化功能,其中要在页面中实现产品的动态属性加载,这
就用到了动态添加table(table在这里主要是做布局),动态添加控件,但在实现过程也遇到了些小问题,在此把问题
说说,以及问题的解决方案,和大家一起分享。
实现动态添加table,动态添加控件分成两种行为操作:加载页面时创建加载、加载页面后创建加载
一。加载页面时创建加载
什么意思呢?就是在Page_Load时就开始加载动态的控件或table,下面看看代码吧!~
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
}
}
//动态创建table,以及控件
private void DynamicTableRow()
{
.........................
//创建你要动态创建的控件或table
}
对于这种行为操作是相对简单的了,不会出现视图加载失败的问题。
二。加载页面后创建加载
举例说明吧,如我在页面上添加了一个DropDownList的控件,带入如下:
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>5</asp:ListItem>
<asp:ListItem>7</asp:ListItem>
</asp:DropDownList>
当选择1时要执行添加1个TextBox的控件
当选择5时要执行添加5个TextBox的控件
当选择7时要执行添加7个TextBox的控件
且当点击页面上的“提交”按钮时要获取到这些创建的控件和输入的控件的值
如果使用之前那种方法,你在页面上是可以看到动态加载了控件和table,但你在动态加载生成的TextBox控件中输入值,并
点击“提交”时,发现找不到控件,且你查看页面的源文件的HTML代码页没有发现动态创建的控件,之所以这样,我上网查
了相关的资料,好像是视图没有把动态创建的控件加载进去,我采用了一个方法去解决这个问题,就是重写了LoadViewState
还原视图状态信息,代码如下:
/// <summary>
/// 重写LoadViewState,还原视图状态信息
/// </summary>
/// <param name="savedState"></param>
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
int n = this.table.Rows.Count;
if (ViewState["controsladded"] == null)
{
if (Session["ids"] != null)
{
DynamicTableRow(Session["ids"] as List<int>);
}
}
}
/// <summary>
/// 动态控制页面table,加载一行的数据及控件,一行4列,2个属性,2个值
/// </summary>
private void DynamicTableRow(List<int> ids)
{
int num = 0;
int nowidsCount = ids.Count;
TableRow tr = new TableRow();
foreach (int id in ids)
{
num = num + 1;
TableHeaderCell celTh = new TableHeaderCell();
celTh.Width = 130;
Label thLabel = new Label();
thLabel.ID = id.ToString() + "+label";
thLabel.Text = NameTechnique(id);
celTh.Controls.Add(thLabel);
TableCell celTd = new TableCell();
TextBox txtBox = new TextBox();
txtBox.TextMode = TextBoxMode.MultiLine;
txtBox.Width = 300;
txtBox.ID = id.ToString();
celTd.Controls.Add(txtBox);
tr.Cells.Add(celTh);
tr.Cells.Add(celTd);
//控制一行显示的数据
if (num == 2)
{
this.table.Rows.Add(tr);
nowidsCount = nowidsCount - 2;
}
else
{
if (num == nowidsCount)
{
if (num < 2)
{
for (int i = 1; i <= (2 - num); i++)
{
//补空列,一行必须满足有4列
TableHeaderCell celThNone = new TableHeaderCell();
celThNone.Width = 130;
TableCell celTd1None = new TableCell();
tr.Cells.Add(celThNone);
tr.Cells.Add(celTd1None);
}
}
this.table.Rows.Add(tr);
}
}
if (num == 2)
{
tr = new TableRow();
num = 0;
}
}
ViewState["controlsadded"] = true;
}
以上是个人的简单总结,对这个页面的视图也没有什么研究,有个研究的朋友希望一起分享,感兴起的朋友可以一起讨论学习!~