ASP.NET一个发工资的测试

  最近学习ASP.NET,为了检验我们学习的ASP.NET的效果,所以老师写了一个小小程序来给我测试。说实话,在规定的时间4小时里,我想没有几个人能实现,先来说说的它的功能大致是给员工发工资。好了,话不多说了,下面是我用简单三层做的,部分功能代码。

1.我们在登录的时候,是有权限的,不同员工有不同的界面。解决这个问题,我想到了Session来判断

Login后台代码:

  EmployeeService ctx = new EmployeeService();

protected void Page_Load(object sender, EventArgs e)
{
Session.RemoveAll();
}

protected void Button1_Click(object sender, EventArgs e)
{
string eid = this.txtEid.Text.Trim();
string epwd = this.txtEPwd.Text.Trim();
EmployeesInfo eminfo= ctx.GetEntity(eid,epwd);
if (eminfo == null)
{
Page.ClientScript.RegisterStartupScript(typeof(Page), "", "alert('请检查你的登录帐号或密码是否正确!! ');", true);
}
else if (eminfo.DepartmentInfo.depName == "人事部")
{
Session["login"] = eminfo;
Response.Redirect("Employee.aspx");
}
else
{
Session["login"] = eminfo;
Response.Redirect("ViewSalary.aspx");
}
}
}

当然,我的三层是分开了的,用来封装了不同的方法,我用Linq写作通用的class这样方便调用。

  1  ///<summary>
2 /// LinqHelper数据访问类
3 ///</summary>
4 ///<typeparam name="TDataBase"></typeparam>
5 public class LinqHelper<TDataBase> where TDataBase : DataContext , new()
6 {
7 private readonly string connStr = ConfigurationManager.ConnectionStrings["Models.Properties.Settings.EmployeesDBConnectionString"].ConnectionString;
8
9 TDataBase db = null;
10
11 ///<summary>
12 /// 构造方法、得到全局上下文对象
13 ///</summary>
14 public LinqHelper()
15 {
16 db = GetDataContext();
17 }
18
19 ///<summary>
20 /// 获得数据上下文对象
21 ///</summary>
22 ///<returns></returns>
23 public TDataBase GetDataContext()
24 {
25 //实例化数据上下文对象
26 TDataBase db = new TDataBase();
27 //设置数据库连接字符串(Linq2SQL中数据库的连接默认是打开状态)
28 db.Connection.ConnectionString = connStr;
29 //打开连接
30 if (db.Connection.State == System.Data.ConnectionState.Closed)
31 {
32 db.Connection.Open();
33 }
34 return db;
35 }
36
37 #region 查询
38 ///<summary>
39 /// 查询所有集合
40 ///</summary>
41 ///<typeparam name="T">指代类型</typeparam>
42 ///<returns>指代类型对象集合</returns>
43 public List<T> GetList<T>() where T : class
44 {
45 return db.GetTable<T>().ToList();
46
47 }
48
49 ///<summary>
50 /// 根据条件查询集合
51 ///</summary>
52 ///<typeparam name="T">指代类型</typeparam>
53 ///<param name="predicate">Lambda表达式</param>
54 ///<returns>指代类型对象集合</returns>
55 public List<T> GetList<T>(Expression<Func<T, bool>> predicate) where T : class
56 {
57 return db.GetTable<T>().Where(predicate).ToList();
58 }
59
60 ///<summary>
61 /// 根据条件查询对象
62 ///</summary>
63 ///<typeparam name="T">指代类型</typeparam>
64 ///<param name="predicate">Lambda表达式</param>
65 ///<returns>指代类型对象</returns>
66 public T GetEntity<T>(Expression<Func<T, bool>> predicate) where T : class
67 {
68 return db.GetTable<T>().Where(predicate).SingleOrDefault();
69 }
70 #endregion
71
72 ///<summary>
73 /// 新 增
74 ///</summary>
75 ///<typeparam name="T">指代类型</typeparam>
76 ///<param name="Entity">要新增的指代类型对象</param>
77 public void InsertEntity<T>(T Entity) where T : class
78 {
79 //打开连接
80 if (db.Connection.State == System.Data.ConnectionState.Closed)
81 {
82 db.Connection.Open();
83 }
84 //创建事务
85 db.Transaction = db.Connection.BeginTransaction();
86 try
87 {
88 db.GetTable<T>().InsertOnSubmit(Entity);
89 db.SubmitChanges();
90 //提交事务
91 db.Transaction.Commit();
92 }
93 catch (Exception ex)
94 {
95 db.Transaction.Rollback();
96 throw ex;
97 }
98 finally
99 {
100 db.Connection.Close();
101 }
102 }
103
104 ///<summary>
105 /// 更 新
106 ///</summary>
107 ///<typeparam name="T">指代类型</typeparam>
108 ///<param name="Entity">要更新的指代类型对象</param>
109 public void UpdateEntity<T>(T Entity) where T : class
110 {
111 //打开连接
112 if (db.Connection.State == System.Data.ConnectionState.Closed)
113 {
114 db.Connection.Open();
115 }
116 //创建事务
117 db.Transaction = db.Connection.BeginTransaction();
118 try
119 {
120 //附加实体对象
121 db.GetTable<T>().Attach(Entity);
122 //设置更新并发冲突策略及更新模式
123 db.Refresh(RefreshMode.KeepCurrentValues, Entity);
124 db.SubmitChanges(ConflictMode.ContinueOnConflict);
125 //提交事务
126 db.Transaction.Commit();
127 }
128 catch (Exception ex)
129 {
130 db.Transaction.Rollback();
131 throw ex;
132 }
133 finally
134 {
135 db.Connection.Close();
136 }
137 }

 

同时我用的是Linq来获取的数据上下文,这样省去了实体层构建,下面是我DAL类中的一些方法:

 1   public class EmployeeDAO
2 {
3
4 LinqHelper<EmployeeDataContext> lingHelper = new LinqHelper<EmployeeDataContext>();
5 PayrollRecordDAO pDao = new PayrollRecordDAO();
6
7 ///<summary>
8 /// 获得所有员工信息
9 ///</summary>
10 ///<returns></returns>
11 public List<EmployeesInfo> GetAll()
12 {
13 return lingHelper.GetList<EmployeesInfo>();
14 }
15
16 ///<summary>
17 /// 根据部门编号获取员工信息
18 ///</summary>
19 ///<param name="depID"></param>
20 ///<returns></returns>
21 public List<EmployeesInfo> GetAllbyDepId(int depID)
22 {
23 return lingHelper.GetList<EmployeesInfo>(e => e.depId == depID);
24 }
25
26 ///<summary>
27 /// 根据职位编号获取员工信息
28 ///</summary>
29 ///<param name="mId"></param>
30 ///<returns></returns>
31 public List<EmployeesInfo> GetAllByMid(int mId)
32 {
33 return lingHelper.GetList<EmployeesInfo>(e => e.mId == mId);
34 }
35
36 ///<summary>
37 /// 登录验证
38 ///</summary>
39 ///<param name="eID"></param>
40 ///<param name="ePwd"></param>
41 ///<returns></returns>
42 public EmployeesInfo GetEntity(string eID, string ePwd)
43 {
44 EmployeesInfo em = lingHelper.GetEntity<EmployeesInfo>(e => e.eId == eID && e.ePwd==ePwd.Trim());
45 if (em!=null)
46 {
47 return em;
48 }
49 else
50 {
51 return null;
52 }
53 }
54
55 ///<summary>
56 /// 根据员工编号获取员工信息
57 ///</summary>
58 ///<param name="eID"></param>
59 ///<returns></returns>
60 public EmployeesInfo GetEntity(string eID)
61 {
62 return lingHelper.GetEntity<EmployeesInfo>(e => e.eId == eID);
63 }
64
65 ///<summary>
66 /// 删除员工
67 ///</summary>
68 ///<param name="e"></param>
69 public void DeleteEntity(string eId)
70 {
71 //先删工资记录
72 pDao.DeleteEntity(eId);
73 //再删员工
74 lingHelper.DeleteEntity<EmployeesInfo>(GetEntity(eId));
75 }
76
77 }

然后是发工资的方法:

 1  LinqHelper<EmployeeDataContext> lingHelper = new LinqHelper<EmployeeDataContext>();
2
3 ///<summary>
4 /// 发工资
5 ///</summary>
6 ///<param name="payinfo"></param>
7 public void insertSalary(PayrollRecordInfo payinfo)
8 {
9 lingHelper.InsertEntity<PayrollRecordInfo>(payinfo);
10 }
11
12 ///<summary>
13 /// 根据员工编号查询该员工本月是否发工资
14 ///</summary>
15 ///<param name="eid">员工编号</param>
16 ///<returns>已发为假,未发为真</returns>
17 public Boolean isSendSalaryThisMouth(string eid)
18 {
19 if (lingHelper.GetList<PayrollRecordInfo>(s => s.eId == eid && s.prDate.Month ==DateTime.Now.Month && s.prDate.Year==DateTime.Now.Year).Count>0)
20 {
21 return false;
22 }
23 return true;
24 }
25
26 ///<summary>
27 /// 根据员工编号删除所有该员工工资记录
28 ///</summary>
29 ///<param name="eid">员工编号</param>
30 public void DeleteEntity(string eid)
31 {
32 lingHelper.DeleteEntity<PayrollRecordInfo>(lingHelper.GetList<PayrollRecordInfo>(s => s.eId == eid));
33 }
34
35 ///<summary>
36 /// 根据员工编号返回本月记录
37 ///</summary>
38 ///<param name="eid"></param>
39 ///<returns></returns>
40 public PayrollRecordInfo GetEntityByEidthisMonth(string eid)
41 {
42 return lingHelper.GetEntity<PayrollRecordInfo>(s => s.prDate.Month == DateTime.Now.Month && eid == s.eId);
43 }
44 }

职位的方法:

 1    public class MarjorDAO
2 {
3
4 LinqHelper<EmployeeDataContext> lingHelper = new LinqHelper<EmployeeDataContext>();
5
6
7 ///<summary>
8 /// 根据部门编号获取职位信息
9 ///</summary>
10 ///<param name="dePid"></param>
11 ///<returns></returns>
12 public List<MarjorInfo> getMajorByDepid(int dePid)
13 {
14 return lingHelper.GetList<MarjorInfo>(s=>s.depId==dePid);
15 }
16
17
18
19 ///<summary>
20 /// 根据职位编号获取职位信息
21 ///</summary>
22 ///<param name="mid">职位编号</param>
23 ///<returns></returns>
24 public MarjorInfo getMajorBymid(int mid)
25 {
26 return lingHelper.GetEntity<MarjorInfo>(s=>s.mId==mid);
27 }
28 }

每一个部门的情况:

 1 public class DepartmentDAO
2 {
3 LinqHelper<EmployeeDataContext> lingHelper = new LinqHelper<EmployeeDataContext>();
4
5 public List<DepartmentInfo> GetAll()
6 {
7 return lingHelper.GetList<DepartmentInfo>();
8 }
9
10 public DepartmentInfo GetEntity(int depID)
11 {
12 return lingHelper.GetEntity<DepartmentInfo>(d => d.depId == depID);
13 }
14 }

下面是aspx的C#代码:

这个是主界面的代码

 1  DepartmentService depars = new DepartmentService();
2 EmployeeService ctx = new EmployeeService();
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 if (!Page.IsPostBack)
6 {
7 //判断Session 是否为空,如果为空,踢回登录页面
8 if (Session["login"] != null)
9 {
10 EmployeesInfo eminfo = (EmployeesInfo)Session["login"];
11 //如果不为空,赋值给显示某某登录。
12 this.lblEmName.Text = eminfo.eName;
13 //用TreeView进行数据简单的绑定
14 TreeNode root = new TreeNode("所有部门", "0");
15 foreach (DepartmentInfo item in depars.GetAll())
16 {
17 TreeNode nd = new TreeNode(item.depName, item.depId.ToString());
18 root.ChildNodes.Add(nd);
19 }
20 //添加到树上
21 this.TreeView1.Nodes.Add(root);
22 //查询响应
23 this.GridView1.DataSource = ctx.GetAll();
24 this.GridView1.DataBind();
25 }
26 else
27 {
28 Response.Redirect("Login.aspx");
29 }
30 }
31 }
32
33 protected void btnDele_Click(object sender, EventArgs e)
34 {
35 //通过隐藏域获取值
36 string ids = this.hid.Value;
37 //拆分开
38 foreach (var item in ids.Split(','))
39 {
40 //调用方法删除
41 ctx.DeleteEntity(item);
42 }
43 //响应数据
44 this.GridView1.DataSource = ctx.GetAll();
45 this.GridView1.DataBind();
46 }
47
48 protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
49 {
50 //获取treeview选中的值
51 TreeNode tn=this.TreeView1.SelectedNode;
52 if (tn.Value == "0")
53 {
54 this.GridView1.DataSource = ctx.GetAll();
55 this.GridView1.DataBind();
56 }
57 else
58 {
59 this.GridView1.DataSource = ctx.GetAll(int.Parse(tn.Value));
60 this.GridView1.DataBind();
61 }
62 }
63 }

在做删除的时候,我们如何让前台和后台交互呢?在前台获取到多个要删除的编号,我们可以通过隐藏域来传值,这是最方便的做法。这里我用到点jQuery来获取标签熟悉,这样比js简单

  1  <script type="text/javascript">
2
3 function exit(){
4 var ex=confirm("你确定要退出系统吗??");
5 if(ex==true)
6 {
7 window.location.href="Login.aspx";
8 }
9 }
10
11 $(function() {
12 //修改
13 $("#btnSend").click(function() {
14 var $chk = $("input[type=checkbox][checked=true]");
15 if ($chk.length >1) {
16 alert("选择项不能大于1项!!");
17 returnfalse;
18 }
19 if ($chk.length ==1) {
20 ymPrompt.win({ message: 'SendSalary.aspx?eid='+ $chk.get(0).value, width: 500, height: 330, title: '发放工资', iframe: true });
21
22 }
23 else{
24 ymPrompt.win({ message: 'SendSalary.aspx?', width: 500, height: 330, title: '发放工资', iframe: true });
25 }
26
27 });
28 //删除
29 $("#btnDele").click(function() {
30 var ids ="";
31 var $chk = $("input.chkItems[type=checkbox][checked=true]");
32 if ($chk.length ==0) {
33 alert("请选择要删除的项!!");
34 returnfalse;
35 }
36 $.each($chk, function(i, item) {
37 if (i == $chk.length -1) {
38 ids += item.value;
39 }
40 elseif (item.checked) {
41 ids += item.value +",";
42 }
43 });
44 $("#<%=this.hid.ClientID %>").val(ids);
45 });
46
47
48 //光棒
49 $("table tr").hover(function() {
50 $(this).addClass("gb");
51 }, function() {
52 $(this).removeClass("gb");
53 });
54 //全选
55 $("#chkAll").click(function() {
56 $("input[type=checkbox]").attr("checked", this.checked);
57 //如果全选选中,清空隐藏域,将所有单选按钮的value加入隐藏域
58 });
59 //清空隐藏域,循环判断单选是否选中,选中的value加入隐藏域
60 $(".chkItems").click(function() {
61 var flag =true;
62 $.each($(".chkItems"), function(i, item) {
63 if (!item.checked) {
64 flag =false;
65 }
66 });
67 if (flag) {
68 $("#chkAll").attr("checked", "checked");
69 }
70 else {
71 $("#chkAll").attr("checked", "");
72 }
73 });
74 });
75 </script>
76
77 </head>
78 <body>
79 <form id="form1" runat="server">
80 <input type="hidden" id="hid" runat="server"/>
81 <div>
82
83 <div id="left1">
84 <asp:panel BorderStyle="Ridge" Width="217px" runat="server" Height="174px">
85 欢迎你:<asp:Label ID="lblEmName" ForeColor="Red" runat="server" Text="Label"></asp:Label>
86 &nbsp; 访问系统<a href="javascript:exit();">&nbsp; 退出</a>
87 <asp:TreeView ID="TreeView1" runat="server"
88 onselectednodechanged="TreeView1_SelectedNodeChanged">
89 </asp:TreeView>
90 </asp:panel>
91 </div>
92 <div>
93 <asp:Button ID="btnDele" runat="server" Text="删除员工"
94 onclick="btnDele_Click"/>
95 <input id="btnSend" type="button" value="发放工资"/>
96 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
97 Width="583px">
98 <Columns>
99 <asp:TemplateField>
100 <HeaderTemplate>
101 <input id="chkAll" type="checkbox"/>
102 </HeaderTemplate>
103 <ItemTemplate>
104 <input class="chkItems" value='<%#Eval("eId") %>' type="checkbox" />
105 </ItemTemplate>
106 </asp:TemplateField>
107 <asp:BoundField DataField="eId" HeaderText="工号"/>
108 <asp:BoundField DataField="eName" HeaderText="姓名"/>
109 <asp:TemplateField HeaderText="性别">
110 <ItemTemplate>
111 <asp:Label ID="Label1" runat="server" Text='<%# (int)Eval("eSex")==0?"男":"女" %>'></asp:Label>
112 </ItemTemplate>
113 </asp:TemplateField>
114 <asp:TemplateField HeaderText="所在部门">
115 <ItemTemplate>
116 <asp:Label ID="Label2" runat="server"
117 Text='<%# Eval("DepartmentInfo.depName") %>'></asp:Label>
118 </ItemTemplate>
119 </asp:TemplateField>
120 <asp:TemplateField HeaderText="所属职位">
121 <ItemTemplate>
122 <asp:Label ID="Label3" runat="server" Text='<%# Eval("MarjorInfo.mName") %>'></asp:Label>
123 </ItemTemplate>
124 </asp:TemplateField>
125 </Columns>
126 </asp:GridView>
127 </div>
128 </div>
129 </form>
130 </body>

然后呢,我再去实现发工资,在发工资的时候,我要实现一个三级联动,并且是无界面的刷新的,在发工资的时候,页面不能跳转,只能在本页面弹出,这个就不得不用到插件进行弹窗操作,同时还得用到Ajax实现交互。好了,下面我们来说说这个弹窗:

插件我用的是(ymPrompt),感觉还是不错.那么我们来实现弹窗同时数据绑定前台页面是3个下拉列表框:

 1 <script type="text/javascript" src="Scripts/jquery-1.4.1.min-vsdoc.js"></script>
2
3 <script type="text/javascript">
4
5 /*提示窗体*/
6 function handler(msg) {
7 alert(msg);
8 //刷新父窗体
9 window.parent.location.href = window.parent.location.href;
10 }
11
12 function LoadMajor(did) {
13 $("#ddlMajor").empty();
14 //跳转的处理层序
15 $.getJSON("Controller/LD.ashx", { action: "major", did: did }, function(data) {
16 $.each(data, function(i, item) {
17 $("<option></option>")
18 .val(item["mId"])
19 .text(item["mName"])
20 .appendTo($("#ddlMajor"));
21 });
22 });
23 }
24
25 function LoadName(mid) {
26 $("#ddlName").empty();
27 $.getJSON("Controller/LD.ashx", { action: "name", mid: mid }, function(data) {
28 $.each(data, function(i, item) {
29 $("<option></option>")
30 .val(item["eId"])
31 .text(item["eName"])
32 .appendTo($("#ddlName"));
33 });
34 });
35 }
36 function LoadSalary(mid) {
37 $.getJSON("Controller/LD.ashx", { action: "salary", mid: mid }, function(data) {
38 $("#txtSalary").val(data["Salary"]);
39 $("#txtPrTotal").val(data["Salary"]);
40 });
41 }
42 $(function() {
43 //联动
44 $("#ddlDepar").change(function() {
45 LoadMajor($("#ddlDepar").val());
46 });
47 $("#ddlMajor").change(function() {
48 LoadName($("#ddlMajor").val());
49 });
50 $("#ddlName").change(function() {
51 LoadSalary($("#ddlMajor").val());
52 });
53 $("#ddlName").click(function() {
54 LoadSalary($("#ddlMajor").val());
55 });

那么我们交给了后台一般处理程序Hlander,我们只需要得到它传过来的值就好了

string action = context.Request.QueryString["action"];

所以说,我们在处理代码的时候只需要判断一下就可以实现这个无刷新的联动

 1   EmployeeDataContext ctx = new EmployeeDataContext();
2 ctx.DeferredLoadingEnabled = false;
3 context.Response.ContentType = "text/plain";
4 string action = context.Request.QueryString["action"];
5 //根据部门编号获取职位信息
6 if (action == "major")
7 {
8 JavaScriptSerializer js = new JavaScriptSerializer();
9 List<MarjorInfo> lst = ctx.MarjorInfo.Where(c => c.depId.ToString() == context.Request.QueryString["did"]).ToList();
10 context.Response.Write(js.Serialize(lst));
11 }
12 //根据职位编号获取员工信息
13 else if (action == "name")
14 {
15 JavaScriptSerializer js = new JavaScriptSerializer();
16 List<EmployeesInfo> lst = ctx.EmployeesInfo.Where(c => c.mId.ToString() == context.Request.QueryString["mid"]).ToList();
17 context.Response.Write(js.Serialize(lst));
18 }
19 //根据职位编号获取基本工资
20 else if (action == "salary")
21 {
22 JavaScriptSerializer js = new JavaScriptSerializer();
23 MarjorInfo ma = ctx.MarjorInfo.Where(c => c.mId.ToString() == context.Request.QueryString["mid"]).FirstOrDefault();
24 context.Response.Write(js.Serialize(ma));
25 }
26 //发送工资
27 else
28 {
29 JavaScriptSerializer js = new JavaScriptSerializer();
30 if (!new PayrollRecordService().isSendSalaryThisMouth(context.Request.QueryString["eId"]))
31 {
32 context.Response.Write("本月工资已发,不能重复发送!!");
33 return;
34 }
35 PayrollRecordInfo pay = (PayrollRecordInfo)js.Deserialize<PayrollRecordInfo>(context.Request.QueryString["pay"]);
36 pay.prDate = DateTime.Now;
37 new PayrollRecordService().insertSalary(pay);
38 context.Response.Write("发送成功!!");
39 }

这样,我的三级联动就没有什么问题了。

 1  if (Session["login"] != null)
2 {
3
4 if (Request.QueryString["eid"] != null)
5 {
6 EmployeesInfo eminfo = ctx.GetEntity(Request.QueryString["eid"]);
7 this.ddlDepar.Items.Add(new ListItem(eminfo.DepartmentInfo.depName, eminfo.depId.ToString()));
8 this.ddlMajor.Items.Add(new ListItem(eminfo.MarjorInfo.mName, eminfo.mId.ToString()));
9 this.ddlName.Items.Add(new ListItem(eminfo.eName, eminfo.eId.ToString()));
10 this.txtPrTotal.Text = eminfo.MarjorInfo.Salary.ToString();
11 this.txtSalary.Text = eminfo.MarjorInfo.Salary.ToString();
12 }
13 else
14 {
15 this.ddlDepar.DataSource = deps.GetAll();
16 this.ddlDepar.DataTextField = "depName";
17 this.ddlDepar.DataValueField = "depId";
18 this.ddlDepar.DataBind();
19 }
20 }

 

写到这里的时候我实在不知道该写什么了,感觉都已经差不多了,但是还有工资的浮动还没有实现,所谓工资浮动实现就是说我们在基本工资不变的情况下,我们输入奖金或罚款后会自动计算出本月你的工资,同样我是用jQuery实现的。

 1     //价格联动
2 $("#txtprPenalty").keyup(function() {
3 $("#txtPrTotal").val(eval($("#txtSalary").val() - $("#txtprPenalty").val() + "+" + $("#txtprReward").val()));
4 });
5 $("#txtprReward").keyup(function() {
6 $("#txtPrTotal").val(eval($("#txtSalary").val() - $("#txtprPenalty").val() + "+" + $("#txtprReward").val()));
7 });
8
9 //发工资
10 $("#btnFgz").click(function() {
11 var payrollrecord = "{eId: " + $("#ddlName").val() + ",prPenalty:" + $("#txtprPenalty").val() + ",prReward:" + $("#txtprReward").val() + ",PrTotal:" + $("#txtPrTotal").val() + "}";
12 $.get("Controller/LD.ashx", { action: "send", eId: $("#ddlName").val(), pay: payrollrecord }, function(msg) {
13 handler(msg);
14 });
15 });
16
17 });
18 </script>
19 </head>
20 <body>
21 <form id="form1" runat="server">
22 <div>
23 <table cellspacing="0" id="table" class="table" runat="server" border="1">
24 <tr>
25 <td colspan="2" style="text-align: center; font-weight: bold;">
26 发 放 工 资
27 </td>
28 </tr>
29 <tr>
30 <td class="th">
31 所属部门:
32 </td>
33 <td>
34 <asp:DropDownList ID="ddlDepar" runat="server" Width="127px">
35 </asp:DropDownList>
36 </td>
37 </tr>
38 <tr>
39 <td class="th">
40 所属职位:
41 </td>
42 <td>
43 <asp:DropDownList ID="ddlMajor" runat="server" Width="128px">
44 </asp:DropDownList>
45 </td>
46 </tr>
47 <tr>
48 <td class="th">
49 员工姓名:
50 </td>
51 <td>
52 <asp:DropDownList ID="ddlName" runat="server" Width="129px">
53 </asp:DropDownList>
54 </td>
55 </tr>
56 <tr>
57 <td class="th">
58 基本工资:
59 </td>
60 <td>
61 <asp:TextBox ID="txtSalary" ReadOnly="true" runat="server"></asp:TextBox>
62 </td>
63 </tr>
64 <tr>
65 <td class="th">
66 扣除工资:
67 </td>
68 <td>
69 <asp:TextBox ID="txtprPenalty" runat="server" Text="0"></asp:TextBox>
70 </td>
71 </tr>
72 <tr>
73 <td class="th">
74 浮动工资:
75 </td>
76 <td>
77 <asp:TextBox ID="txtprReward" runat="server" Text="0"></asp:TextBox>
78 </td>
79 </tr>
80 <tr>
81 <td class="th">
82 本月工资:
83 </td>
84 <td>
85 <asp:TextBox ID="txtPrTotal" ReadOnly="true" runat="server"></asp:TextBox>
86 </td>
87 </tr>
88 <tr>
89 <td colspan="2" align="center">
90 <input id="btnFgz" type="button" value="发放工资"/>
91 </td>
92 </tr>
93 </table>
94 </div>
95 </form>
96 </body>

  这样,我的这个练习就基本没有什么大的问题了,费了好多力气才搞定。这是我的第一篇关于技术的文档,我不知道写的怎么样,希望大家多多的指点指点。嘿嘿









 

 

 

转载于:https://www.cnblogs.com/yuchangchuan/archive/2011/11/24/2261079.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值