1. 动态赋值的问题,
这个问题整整搞了两天,一开始想实现的效果是:在工资添加页面中,不需要用户输入员工编码,因为用户不一定就能记住每个员工的编码,而是在双击控件或者点击控件后面的按钮的时候弹出一个新的窗口,在弹出的新窗口中使用表格(GridView)来显示员工的信息,当用户双击表中某一行的信息时,窗口就会自动关闭,并且把值赋予原来子窗口中。这也是很多企业软件中经常使用的方法,比如U3中就是这样使用的。
但是,使用了Session来存储值,在原来窗口中获取,这样是不能实时获取的;使用选择按钮来实现,但是这种方法又不能跨浏览器来获取,智能在当前的浏览器窗口来传值
protected void gvMessageEmp_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { …….. //实现双击某一行后,动态更新工资页面的信息;放在Session中会占用缓存 //Session["SelectEmpID"] = e.Row.Cells[0].Text.ToString().Trim(); //Session["SelectEmpName"] = e.Row.Cells[1].Text.ToString().Trim(); //Session["SelectDepID"] = e.Row.Cells[2].Text.ToString().Trim(); //Session["SelectDepName"] = e.Row.Cells[3].Text.ToString().Trim(); string jsString = "window.opener.document.getElementById('txtEmpId').value='" + e.Row.Cells[0].Text.ToString().Trim() + "';window.opener.document.getElementById('txtEmpName').value='" + e.Row.Cells[1].Text.ToString().Trim() + "';window.opener.document.getElementById('txtDepId').value='" + e.Row.Cells[2].Text.ToString().Trim() + "';window.opener.document.getElementById('txtDepName').value='" + e.Row.Cells[3].Text.ToString().Trim() + "';window.close();"; e.Row.Attributes.Add("ondblclick", jsString); } }
最后,通过询问论坛一个.Net朋友,才解决了这个问题:
上面就是这个问题的解决方法,原本我是放在Session中的,但是这个占用浏览器的缓存,数据多了就会影响用户浏览的速度。
问题的关键就在: window.opener.document.getElementById('txtEmpName')代码上opener是专门针对open一个子窗口的父窗口的引用。
2. 需要查询不同表之间的数据,而且还要对表进行数据统计
我要实现的功能是查询应聘人员的录取,待定,淘汰的信息统计,这个应聘人员表中没有这些字段,只有一个应聘状态标记,而且这里的职位信息时从招聘表的招聘岗位中获取的。一开始是想通过表之间的关联关系进行查询统计,但是这样数据的处理量和逻辑就会非常麻烦
最后的解决方法就是新建了一张视图,在视图的的SQL语句中对信息进行统计
代码如下:
SELECT DISTINCT TOP 100 PERCENT dbo.HRH_Recruitment.PositionName AS PsName, dbo.HRH_Recruitment.Several AS PsSeveral, (SELECT COUNT(ApplyID) AS RecruitState FROM dbo.HRH_Apply WHERE (ApplyID IN (SELECT ApplyID FROM HRH_Apply WHERE ApplyState = 1))) AS RecruitState, (SELECT COUNT(ApplyID) AS undeterminedState FROM dbo.HRH_Apply WHERE (ApplyID IN (SELECT ApplyID FROM HRH_Apply WHERE ApplyState = 0))) AS UndeterminedState, (SELECT COUNT(ApplyID) AS EliminateState FROM dbo.HRH_Apply WHERE (ApplyID IN (SELECT ApplyID FROM HRH_Apply WHERE ApplyState = 2))) AS EliminateState, dbo.HRH_Recruitment.UsefulTime AS UseTime, dbo.HRH_Recruitment.State AS PsState FROM dbo.HRH_Apply INNER JOIN dbo.HRH_Recruitment ON dbo.HRH_Apply.ApplyPosition = dbo.HRH_Recruitment.PositionName ORDER BY dbo.HRH_Recruitment.UsefulTime
这样既没有影响表的结构,而且省去了很多在业务逻辑层的代码