背景:
由于在一个页面上需要有多个不同的弹出框,如果我们将好几个弹出框都写在一个页面上的话,那页面岂不是热闹的很啊,不但看起来不顺眼吧,而且写的时候也很乱,所以我们想到将不同的弹出框写成一个窗体,点击按钮的时候弹出一个窗体
问题1:
想的挺好的,可是 一开始就遇到了问题,直接在本页面中弹出一个子窗体的时候样式不是很乐观,本来在网上查了例子,人家设置属性能控制弹出的窗体跟弹出框样式一模一样,可是我设置了之后一点变化都没有,随后我写了一些css修改了一下样式,可是还是很不乐观,后来高玮师哥给提供了一个思路,就是将弹出的窗体放在一个iframe控件上,这样的话样式就跟弹出框没什么区别啦.
解决方法:
<%-- 先将此div隐藏,并将iframe控件放在其中 --%>
<div id="updateOrganization" title="批量修改组织" style="display: none">
<iframe id="change" src='ChangeOrganization.aspx?strData=<%=strJS%>' frameborder="0" style="width: 920px; height: 300px"></iframe>
</div>
解释:
src='ChangeOrganization.aspx?strData=<%=strJS%>' 是放到iframe中的窗体和需要传过去的数据
<%--再来写一个a,用来触发弹出窗体的事件--%>
<a class="btn-lit" href="#" οnclick="dialogOpen('addMoreChlidOrganization', '950', '310');"><span>批量修改组织</span></a>
解释:
οnclick="dialogOpen('updateOrganization', '950', '310');"为弹出窗体的方法,它是写在一个js的,updateOrganization为存放iframe的div的id,950为宽,310为高
问题2:
因为这次是实现批量修改的功能,所以弹出窗体时不能单纯的弹出一个空窗体,需要将选择的多条数据一齐在弹出的窗体上显示出来,这时候好需要获取选择的数据,当时我想到的方法就是通过onclick事件来获取选择的数据,接着麻烦就来了,要是这样的话我该怎么弹出窗体啊?那在后台写一个js代码喽
解决方法:
在后台往前台传js: Response.Write("<script language=javascript>dialogOpen('updateOrganization', '950', '310');</script>");前边我说过了,dialogOpen()这个方法是在dialogdemo2.js中写好的,所以往前台写js的时候还需要提前把引用写好了,写成如下:
Response.Write("<script type='text/javascript' src='../js/dialogdemo2.js'></script>");
Response.Write("<script language=javascript>dialogOpen('updateOrganization', '950', '310');</script>");
问题3:
窗体弹出来了,选择的数据怎么也跟着过去呢?开始我想着根据复选框是否被选中,获取这一行中的其他数据,然后将所有选的行存放在一个datatable中,然后将这个datatable整个传到另一个页面,然后将这个datatable一下子就绑定到Repeater上了,想到到美,从后台往前台传json很方便,可是整个传datatable怎么传啊?哎,最后还是以json的格式传到前台的,然后再通过scr将它从前台传到另一页面上,这时候在另一个窗体加载的时候解析就哦了,
问题4:
由于Repeater上绑定的数据是以datatable的格式绑定的,所以json格式的数据是不合适的,怎么办?反序列化?怎么反啊?愁死我了,在网上查了很多json反序列化的方法,都没用上,最后找到一个人家自己写的反序列化方法,然后根据自己想要的,照着别人的方法修改了一个适合自己的反序列化方法。
解决方法:
string ParentId;
strData = Request.QueryString["strData"].ToString();
string jsonStr = "{\"data\":" + strData + "}";
//将Json 字符串格式反序列话为datatable类型
JavaScriptSerializer jss = new JavaScriptSerializer();
//将指定的json字符串转换成对象图
var obj = jss.DeserializeObject(jsonStr);
Dictionary<string, object> dic = (Dictionary<string, object>)obj;
var data = dic["data"];//得到所有行的信息,数组类型,每一个数组是一个Dictionary类型的键值对,即为列
Array rows = (Array)data;//这里从rows 的每一个元素为一个Dictionary类的对象,相当于datatable中的一行的数据
DataTable dt = new DataTable();
foreach (Dictionary<string, object> cols in rows)
{
//为datatable添加列
if (dt.Columns.Count == 0)
{
foreach (string key in cols.Keys)
{
dt.Columns.Add(key);
}
}
DataRow dr = dt.NewRow();
//为行中的每一列列赋值
foreach (string keyname in cols.Keys)
{
dr[keyname] = cols[keyname];
}
dt.Rows.Add(dr);
}
问题5:
这样反序列化后的数据还不是我先要的,还需要根据其中一列数据查找其他的内容,并将它代替,呵呵,这个问题到没有难倒我
解决办法:
//查找到的数据的条数
int num = dt.Rows.Count;
string strTable = "T_Organization";//需要查询的数据库表
string strOrgName;//所属组织名称
//遍历每一行数据
for (int i = 0; i < num; i++)
{
//所属组织的id
ParentId = dt.Rows[i][2].ToString().Trim();
//根据ParentId查找所属组织名称
StringBuilder strWhere = new StringBuilder();
strWhere.Append("Id='" + ParentId + "'");
if (publicBll.GetOrgInfo(strTable, strWhere.ToString()).Rows.Count != 0)
{
//所属组织名称
strOrgName = publicBll.GetOrgInfo(strTable, strWhere.ToString()).Rows[0][1].ToString().Trim();
//将所属组织名称代替ParentId
dt.Rows[i][2] = strOrgName;
}
else {
//将所属组织名称代替ParentId
dt.Rows[i][2] = "无";
}
}
最后,将dt绑定到Repeater上,这次真的哦了
//绑定数据
repUser.DataSource = dt;
repUser.DataBind();
总结:
通过这个例子的实现,发现还有很多的知识对我来说很陌生,不怕大家笑话,这个例子用了我不到三天的时间,里边有一些逻辑确实挺恶心的,也许是我没有经历过的原因吧,下次肯定不会这样了,相信这给我更大的力量鼓励我更加努力的学习,加油!