工资单的编辑与保存
工资单的编辑和保存:
把binding设定为UpdateSourceTrigger=PropertyChanged
,编辑后再 RowEditEnding事件中e.Row.DataContext获得修改后的对象。
第一步:修改BuildSalaryWindow.xaml的设计代码,添加DataGrid,代码如下:
<Window x:Class="HRMSys.UI.BuildSalarySheetWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="BuildSalarySheetWindow" Height="300" Width="600" Loaded="Window_Loaded"> <Grid> <ComboBox Height="23" HorizontalAlignment="Left" Margin="16,10,0,0" Name="cmbYear" VerticalAlignment="Top" Width="100" /> <TextBlock Height="23" HorizontalAlignment="Left" Margin="122,12,0,0" Name="textBlock1" Text="年" VerticalAlignment="Top" /> <ComboBox Height="23" HorizontalAlignment="Left" Margin="140,10,0,0" Name="cmbMonth" VerticalAlignment="Top" Width="120" /> <TextBlock Height="25" HorizontalAlignment="Left" Margin="282,10,0,0" Name="textBlock2" Text="月" VerticalAlignment="Top" Width="19" /> <ComboBox Height="23" HorizontalAlignment="Left" Margin="320,12,0,0" Name="cmbDept" VerticalAlignment="Top" Width="120" DisplayMemberPath="Name" SelectedValuePath="Id" /> <Button Content="生成工资表" Height="23" HorizontalAlignment="Left" Margin="464,11,0,0" Name="btnCreateSalarySheet" VerticalAlignment="Top" Width="75" Click="btnCreateSalarySheet_Click" /> <DataGrid AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" Margin="19,48,0,0" Name="datagridItems" VerticalAlignment="Top" Width="545" RowEditEnding="datagridItems_RowEditEnding"> <DataGrid.Columns> <DataGridComboBoxColumn Width="100" IsReadOnly="True" x:Name="colEmployee" Header="员工" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValueBinding="{Binding EmployeeId}"></DataGridComboBoxColumn> <DataGridTextColumn Width="100" Header="基本工资" Binding="{Binding BaseSalary,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> <DataGridTextColumn Width="100" Header="奖金" Binding="{Binding Bonus,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> <DataGridTextColumn Width="100" Header="罚款" Binding="{Binding Fine,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> <DataGridTextColumn Width="100" Header="其他" Binding="{Binding Other,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>
第二步:在SalarySheetDAL中添加一个SalarySheetItem方法和修改更新的方法,代码如下:
public SalarySheetItem[] GetSalarySheetItems(int year, int month, Guid deptId) { DataTable tableMain = SqlHelper.ExecuteDataTable(@"select * from T_SalarySheet where Year=@Year and Month=@Month and DepartmentId=@DepartmentId", new SqlParameter("@Year", year), new SqlParameter("@Month", month), new SqlParameter("@DepartmentId", deptId)); //先查询指定年月、部门的工资数据主表Id。再查询子表信息 //todo:可以使用“子查询”技术来简化 if (tableMain.Rows.Count == 1) { Guid sheetId = (Guid)tableMain.Rows[0]["Id"]; DataTable table = SqlHelper.ExecuteDataTable(@"select * from T_SalarySheetItem where SheetId=@SheetId", new SqlParameter("@SheetId",sheetId)); SalarySheetItem[] items = new SalarySheetItem[table.Rows.Count]; for (int i = 0; i < table.Rows.Count; i++) { DataRow row = table.Rows[i]; SalarySheetItem item = new SalarySheetItem(); item.Id = (Guid)row["Id"]; item.BaseSalary = (decimal)row["BaseSalary"]; item.Bonus = (decimal)row["Bonus"]; item.Fine = (decimal)row["Fine"]; item.Other = (decimal)row["Other"]; item.EmployeeId = (Guid)row["EmployeeId"]; item.SheetId = (Guid)row["SheetId"]; items[i] = item; } return items; } else if (tableMain.Rows.Count <= 0) { return new SalarySheetItem[0]; } else { throw new Exception(); } }
修改更新的代码如下:
public void Update(SalarySheetItem item) { SqlHelper.ExecuteNonQuery(@"Update T_SalarySheetItem Set BaseSalary=@BaseSalary,Bonus=@Bonus, Fine=@Fine,Other=@Other where Id=@Id", new SqlParameter("@BaseSalary",item.BaseSalary), new SqlParameter("@Bonus", item.Bonus), new SqlParameter("@Fine", item.Fine), new SqlParameter("@Other", item.Other), new SqlParameter("@Id", item.Id)); }
注意:每一个绑定的信息是一个SalarySheetItem
第三步:修改在BuildSalarySheetWindow.xaml.cs中的btnCreateSalarySheet_Click事件添加如下代码:
dal.Build(year, month, deptId); colEmployee.ItemsSource = new EmployeeDAL().ListByDepment(deptId); datagridItems.ItemsSource = new SalarySheetDAL().GetSalarySheetItems( year,month,deptId);
因为我们要在DataGrid中直接修改并直接保存,需要在设计页面中绑定的代码中添加一个代码
并且在添加事件RowEditEnding,代码如下:
private void datagridItems_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { //Binding="{Binding BaseSalary,UpdateSourceTrigger=PropertyChanged}" SalarySheetItem item = (SalarySheetItem)e.Row.DataContext; //e.Row.DataContext修改后的数据对象 new SalarySheetDAL().Update(item); }
运行即可!
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号