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

背景:

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


问题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();


效果图:

        


总结:

       通过这个例子的实现,发现还有很多的知识对我来说很陌生,不怕大家笑话,这个例子用了我不到三天的时间,里边有一些逻辑确实挺恶心的,也许是我没有经历过的原因吧,下次肯定不会这样了,相信这给我更大的力量鼓励我更加努力的学习,加油!




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值