0

我正在尝试创建一个以表格格式显示一些信息的程序。该表的行数可以改变,因此该表可能会或可能不会在一次查看网页时完全可见。

有没有办法让我可以随着时间的推移显示部分表格?例如:显示第 1-30 行 1 分钟,然后显示第 31-50 行 1 分钟,然后再显示第 1-30 行,以此类推。

我到目前为止的代码是:

XAML:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition  Height="50"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid x:Name="InnerGrid"  Grid.Row="1" Background="White"> 
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
     </Grid.ColumnDefinitions>

    </Grid>
</Grid>

 using system; 
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Documents;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Animation;
 using System.Windows.Shapes;
 using System.Diagnostics;   

 namespace MyNameSpace
{
public partial class MainPage : UserControl
{
    //The value of numRows will depend on a value from a database, so it may change every once in a while. 
    int numRows = 45;
    Border border = new Border();
    Border border2 = new Border();

    public MainPage()
    {
        InitializeComponent();
        createRows();
    }

    public Border initializeBorder(Border b)
    {
        b.BorderBrush = new SolidColorBrush(Colors.Black);
        b.BorderThickness = new Thickness(1);
        return b;
    }

    public void createRows()
    {
        //This for loop creates the necessary amount of rows.
        for (int i = 0; i < numRows; i++)
        {
            RowDefinition rd = new RowDefinition();
            rd.Height = new GridLength(20);
            InnerGrid.RowDefinitions.Add(rd);
        }
        //This for loop creates and applies the borders that make the table "appear"
        for (int i = 0; i < numRows; i++)
        {
            Border b = new Border();
            Border b2 = new Border();

            Grid.SetColumn(initializeBorder(b), i);
            Grid.SetRow(initializeBorder(b2), i);

            Grid.SetColumnSpan(b, 11);
            Grid.SetColumnSpan(b2, 11); 
            Grid.SetRowSpan(b, numRows);
            Grid.SetRowSpan(b2, numRows);

            InnerGrid.Children.Add(b); 
            InnerGrid.Children.Add(b2);
        }
    }
}

}

4

2 回答 2

0

这是从服务创建数据网格的简单示例

Silverlight 数据网格

重复这个过程:

从服务中获取数据 解析数据 将其作为项目源分配给数据网格

使用 Disptacher Timer 并在每分钟或任何时间间隔后从服务中获取 xml 数据,对其进行解析并将其分配给 Datagrid。

于 2012-12-08T05:19:14.767 回答
0

这里有一些关于如何经常显示不同“页面”数据的想法。此方法使用 DataGrid 而不是 ItemsControl,因为 DataGrid 不需要您指定 ItemTemplate。我还没有测试过这段代码,但希望它能让你走上正轨。

快速提问:有什么理由不能一次性将数据全部放入 UI 并让用户上下滚动?然后你可以完全取消 DispatcherTimer 和分页。

在 XAML 中,添加xmlns:c="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"InnerGrid 并将其替换为:

<c:DataGrid x:Name="MyDataGrid" Grid.Row="1" AutoGenerateColumns="True" />

在代码隐藏中:

private IEnumerable<MyDataObject>[] _pages;
private int _currentPageIndex = 0;
private ObservableCollection<MyDataObject> _visibleData;
private DispatcherTimer _timer;

public MainPage()
{
    InitializeComponent();

    this._visibleData = new ObservableCollection<MyDataObject>();
    this.MyDataGrid.ItemsSource = this._visibleData;

    this._timer = new DispatcherTimer();
    this._timer.Interval = TimeSpan.FromMinutes(1);
    this._timer.Tick += (sender, args) => this.OnTimerTick();
    this._timer.Start();
}

// I assume you have some code that gets data from the server. Pass that data to this method.
private void ProcessDataFromServer(IEnumerable<MyDataObject> data)
{
    this._pages = this.GroupDataIntoPages(data);
    this.ShowPage(0);
}

private IEnumerable<MyDataObject>[] GroupDataIntoPages(IEnumerable<MyDataObject> data)
{
    // I'll leave this to you.
    // This might help: http://stackoverflow.com/a/860399/674077
}

private void OnTimerTick()
{
    if(this._pages != null)
    {
        this._currentPageIndex++;
        if(this._currentPageIndex >= this._pages.Length)
        {
            this._currentPageIndex = 0;
        }
        this.ShowPage(this._currentPageIndex);
    }
}

private void ShowPage(int pageIndex)
{
    this._visibleData.Clear();
    if(this._pages != null && pageIndex >= 0 && pageIndex < this._pages.Length)
    {
        foreach(var item in this._pages[pageIndex])
        {
            this._visibleData.Add(item);
        }
    }
}
于 2012-12-10T23:38:22.913 回答