您的位置:首页 > 其它

权限系统收获——将一个窗体上的多条数据在另一个窗体上显示

2014-04-16 23:30 330 查看
背景:

由于在一个页面上需要有多个不同的弹出框,如果我们将好几个弹出框都写在一个页面上的话,那页面岂不是热闹的很啊,不但看起来不顺眼吧,而且写的时候也很乱,所以我们想到将不同的弹出框写成一个窗体,点击按钮的时候弹出一个窗体

问题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="#" onclick="dialogOpen('addMoreChlidOrganization', '950', '310');"><span>批量修改组织</span></a>


解释:
onclick="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();


效果图:



总结:

通过这个例子的实现,发现还有很多的知识对我来说很陌生,不怕大家笑话,这个例子用了我不到三天的时间,里边有一些逻辑确实挺恶心的,也许是我没有经历过的原因吧,下次肯定不会这样了,相信这给我更大的力量鼓励我更加努力的学习,加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐