工资单的编辑与保存

工资单的编辑和保存:

把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);
        }

运行即可!

 

posted @ 2013-08-24 12:54  秋水惜朝  阅读(459)  评论(0)    收藏  举报