动态生成页面返回数据的问题--十万火急!

和乐君 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我以前写的好多业务类(是我考虑了很久才写出来的)还得重新写

...全文
147 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2006-05-18
  • 打赏
  • 举报
回复
to 问题:当我点更新(ButtonUpdata_Click)返回的时候,发现我所new出来的control全都没有了!(可能代码写的很烂,为了避免大家头疼,我把代码简化了一点)

造成这种现象的发生,是由于你的control是new出来的,即当提交更新操作的时候,Page要进行重新load,那么所有new出来的control当然不会再进行加载。

解决的办法,可以如下:
用设置control的visible属性来替换control的new操作。
即一开始就添加所需的control,然后修改其的visible属性来控制是否显示。
RUN_ 2006-05-18
  • 打赏
  • 举报
回复
这个没做过,,,帮顶
Knight94 2006-05-18
  • 打赏
  • 举报
回复
to 主要是我开始做业务类时没有过多考虑到表现层的东西,费了好大劲将数据整理成一个多层的字典,而用多层字典做数据源我又没有做过,所以,弄得现在这么难做

如果你的业务层数据比较方便的转到DataTable中的话,那么做起来也不麻烦。
和乐君 2006-05-18
  • 打赏
  • 举报
回复
我现在想用Repeater了,可是我如果放弃原先写的类,从头写也会浪费很多时间的。
和乐君 2006-05-18
  • 打赏
  • 举报
回复
to Knight94(愚翁)
谢谢您关注我的问题。
主要是我开始做业务类时没有过多考虑到表现层的东西,费了好大劲将数据整理成一个多层的字典,而用多层字典做数据源我又没有做过,所以,弄得现在这么难做
和乐君 2006-05-18
  • 打赏
  • 举报
回复
我看只能使用ITemplate了,哪位高手用多层字典做数据源绑定ITemplate了?
Knight94 2006-05-18
  • 打赏
  • 举报
回复
to 可是我面对的数据环境是变化的,我不知道要填进去的控件的数量,我不可能将所有控件都手动添加进去的

按照我的理解,数据应该是有规律的,那么你为什么不用DataList或者DataGrid来绑定模板列,这样随着数据的变化,可以进行动态加载,这样是否要好一些呢。
和乐君 2006-05-18
  • 打赏
  • 举报
回复
可是我面对的数据环境是变化的,我不知道要填进去的控件的数量,我不可能将所有控件都手动添加进去的
和乐君 2006-05-17
  • 打赏
  • 举报
回复
大家一定要帮帮我啊,哪里有这方面的资源也好!太谢谢了!

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧