none
急!急!急!分页时怎么计算每页的工资总额 RRS feed

  • 问题

  • 我用RiA service做公司的薪资报表,用datagrid+DomainDataSource+DataPager分页,在datagrid下部加了个textbox用于显示分页时的工资总额,现在发现二个问题:

    (1)页面进入时,未发生翻页前,如何计算当前页的工资总额呢?
    (2)翻页后,我textbox老是得到上一页的工资总额,问题出现在哪里?

            private void dataPager1_PageIndexChanged(object sender, EventArgs e)

            {
                int total = 0;
                foreach (object o in DataGrid1.ItemsSource)
                {
                    PriceTable _PriceTable = o as PriceTable;
                    total += _PriceTablee.Moneys;

                }
                this.textBlock1.Text = total.ToString();//这里得到的是上一页的工资总额???
            }

    请各位大大帮忙,最好有代码参考,这里我先谢谢大家了。另外,我用的是RiA service+datagrid+DomainDataSource+DataPager分页,别的方法我暂时不考虑,谢谢。

     

    xmal前台代码

     

     

    <navigation:Page x:Class="TopXinZi.Views.HolidayTable_view"

               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

               xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

               xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

               mc:Ignorable="d"

               xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"

               d:DesignWidth="640" d:DesignHeight="480"

               Title="HolidayTable_view Page" xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" xmlns:my="clr-namespace:TopXinZi.Web" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

        <Grid x:Name="LayoutRoot">

            <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:HolidayTable, CreateList=true}" Height="0" LoadedData=" PriceTableDomainDataSource_LoadedData" Name=" PriceTableDomainDataSource" QueryName="GetMoneysQuery" Width="0">

                <riaControls:DomainDataSource.DomainContext>

                    <my:XinZiDomainContext />

                </riaControls:DomainDataSource.DomainContext>

            </riaControls:DomainDataSource>

            <sdk:DataGrid AutoGenerateColumns="False" Height="266" HorizontalAlignment="Left" ItemsSource="{Binding ElementName= PriceTableDomainDataSource, Path=Data}" Margin="26,25,0,0" Name="DataGrid1" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="553" >

                <sdk:DataGrid.Columns>

                    <sdk:DataGridTextColumn x:Name="iDColumn" Binding="{Binding Path=ID}" Header="ID" Width="SizeToHeader" />

                    <sdk:DataGridTextColumn x:Name="MoneysColumn" Binding="{Binding Path=Moneys}" Header="Moneys" Width="200" />

                </sdk:DataGrid.Columns>

            </sdk:DataGrid>

            <sdk:DataPager Height="26" HorizontalAlignment="Left" Margin="26,287,0,0" Name="dataPager1" PageSize="2" VerticalAlignment="Top" Width="553" Source="{Binding ElementName= PriceTableDomainDataSource, Path=Data}" PageIndexChanged="dataPager1_PageIndexChanged" />

            <TextBlock Height="23" HorizontalAlignment="Left" Margin="26,267,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" />

        </Grid>

    </navigation:Page>

     

     

     

    后台CS代码

    namespace TopXinZi.Views

    {

        public partial class HolidayTable_view : Page

        {

         

            public HolidayTable_view()

            {

                InitializeComponent();

     

            }

     

     

     

            // Executes when the user navigates to this page.

            protected override void OnNavigatedTo(NavigationEventArgs e)

            {

            }

     

            private void PriceTableDomainDataSource _LoadedData(object sender, System.Windows.Controls.LoadedDataEventArgs e)

            {

     

                if (e.HasError)

                {

                    System.Windows.MessageBox.Show(e.Error.ToString(), "Load Error", System.Windows.MessageBoxButton.OK);

                    e.MarkErrorAsHandled();

                }

            }

     

           

            private void dataPager1_PageIndexChanged(object sender, EventArgs e)

            {

     

                int total = 0;

     

                foreach (object o in DataGrid1.ItemsSource)

                {

     

                    PriceTable _PriceTable = o as PriceTable;

     

                    total += _PriceTablee.Moneys;

     

                }

     

                this.textBlock1.Text = total.ToString();  // 这里得到的是上一页的工资总额???

            }

     

        }

    }

     

    2010年7月5日 4:22

答案

  • 你好,

         DomainDataSource是异步进行工作的,你可以这样。

            private void PriceTableDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
            {

          if (e.HasError)

         {

              System.Windows.MessageBox.Show(e.Error.ToString(), "Load Error", System.Windows.MessageBoxButton.OK);

              e.MarkErrorAsHandled();

          }

               else // 数据载入完以后改变总值

             {
                decimal total = 0;
                foreach (Track tc in dg.ItemsSource)
                {
                    total += tc.UnitPrice;
                }
                tb.Text = total.ToString();
            }

          }

            private void DataPager_PageIndexChanged(object sender, System.EventArgs e)
            {
                if (PriceTableDomainDataSource.IsLoadingData == false) //第一次load触发该事件时,domaindatasource还在load data
                {
                    decimal total = 0;
                    foreach (Track tc in dg.ItemsSource)
                    {
                        total += tc.UnitPrice;
                    }
                    tb.Text = total.ToString();
                }
            }

    • 已标记为答案 xmf16 2010年7月7日 8:42
    • 取消答案标记 xmf16 2010年7月7日 9:00
    • 已标记为答案 xmf16 2010年7月9日 1:57
    2010年7月7日 5:59

全部回复

  • 你好,

         DomainDataSource是异步进行工作的,你可以这样。

            private void PriceTableDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
            {

          if (e.HasError)

         {

              System.Windows.MessageBox.Show(e.Error.ToString(), "Load Error", System.Windows.MessageBoxButton.OK);

              e.MarkErrorAsHandled();

          }

               else // 数据载入完以后改变总值

             {
                decimal total = 0;
                foreach (Track tc in dg.ItemsSource)
                {
                    total += tc.UnitPrice;
                }
                tb.Text = total.ToString();
            }

          }

            private void DataPager_PageIndexChanged(object sender, System.EventArgs e)
            {
                if (PriceTableDomainDataSource.IsLoadingData == false) //第一次load触发该事件时,domaindatasource还在load data
                {
                    decimal total = 0;
                    foreach (Track tc in dg.ItemsSource)
                    {
                        total += tc.UnitPrice;
                    }
                    tb.Text = total.ToString();
                }
            }

    • 已标记为答案 xmf16 2010年7月7日 8:42
    • 取消答案标记 xmf16 2010年7月7日 9:00
    • 已标记为答案 xmf16 2010年7月9日 1:57
    2010年7月7日 5:59
  • 谢谢小唐版主。

     

    这个问题我问了许多高手,大家都不知道怎么处理,可能是开发中用DomainDataSource的人很少的缘故吧。

    • 已编辑 xmf16 2010年7月9日 1:56
    2010年7月7日 9:20
  • 可以在客户端对datagrid中的数据算一下,虽然这样效率会慢些,但因为你每页的内容不会太多,想来也是可行的吧。


    okokwukai
    2010年7月8日 0:02
  • 可以在客户端对datagrid中的数据算一下,虽然这样效率会慢些,但因为你每页的内容不会太多,想来也是可行的吧。


    okokwukai

    不好意思,我是新手,可以提供代码供我参考一下吗?
    2010年7月8日 2:24