动态生成页面返回数据的问题--十万火急!
和乐君 2006-05-17 09:01:26 可能很初级的问题,把我难倒了,各位一定要帮我!
我作了一个层次结构的类,然后想用这个层次结构动态生成页面,页面是生成了,可作了一些操作以后点按钮却什么也没有了。
具体问题如下:
首先,因为数据现在是不定的,所以我将数据封装到一个带有结构的类中(Privileges类中),代码有点多,贴不出来。
然后,我将这个类传递给页面,页面通过遍历将其格式化显示出来
public partial class testOrg_testDB : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.PReport.Visible = false;
initDDL();
}
}
private void initDDL()
{
for (int i = 0; i < 4; i++)
{
this.DropDownList1.Items.Add(Privileges.objStruct[i]);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string id = this.TextBoxCode.Text;
string obj = this.DropDownList1.SelectedValue;
ViewState["id"] = id;
ViewState["obj"] = obj;
if (id == "")
{
this.PReport.Visible = false;
}
else
{
this.PReport.Visible = true;
Privileges Prl = new Privileges(obj, id);
initOrg(Prl);
}
}
private void initOrg(Privileges p)
{
for (int i = 0; i < p.Panels.Count; i++)
{
//@panel
PReport.ID = "Panel"+p.Panels[i].ID;
PReport.Header.Text=p.Panels[i].Name;
for (int j = 0; j < p.Panels[i].Groups.Count; j++)//@group
{
WebGroupBox pp = new WebGroupBox();
pp.Text = p.Panels[i].Groups[j].CnName;
pp.ID = "Wgb"+p.Panels[i].Groups[j].ID;//@groupid
pp.Controls.Add(makeElements(p.Panels[i].Groups[j]));//@makeElements
PReport.Controls.Add(pp);
}
}
}
private ListControl makeElements(Privileges.Group g)//@element
{
string type = g.Type.ToLower();
ListControl lc;
if (type == "dropdownlist")
{
lc = new DropDownList();
}
else if (type == "radiobuttonlist")
{
lc = new RadioButtonList();
}
else if (type == "checkboxlist")
{
lc = new CheckBoxList();
}
else
{
throw new Exception("invalid data");
}
for (int i = 0; i < g.Elements.Count; i++)
{
ListItem li = new ListItem(g.Elements[i].Name, g.Elements[i].ID);
if (g.Elements[i].State == true)
{
li.Selected = true;
}
lc.Items.Add(li);
}
return lc;
}
protected void ButtonUpdata_Click(object sender, EventArgs e)
{
// for (int j = 0; j < PReport.Controls.Count; j++)//@groups
// {
// Control group = PReport.Controls[j];
// string groupid = group.ID;
// string value = string.Empty;
// for (int m = 0; m < group.Controls.Count; m++)//@elementlist
// {
// Control lc = (ListControl)group.Controls[m];
// }
// }
//}
}
}
问题:当我点更新(ButtonUpdata_Click)返回的时候,发现我所new出来的control全都没有了!(可能代码写的很烂,为了避免大家头疼,我把代码简化了一点)
解决:我通过msdn发现原来由于dom本身就是扁平的(呵呵,我自己这么说,提法有点业余)所以需要通过一个NamingContainer属性来访问下级控件,可是俺找了半天也没有找到这样的方法,msdn中的示例是空的,郁闷...
如果改用Repeater我以前写的好多业务类(是我考虑了很久才写出来的)还得重新写