刷新Silverlight中的DataGrid

时间:2016-06-28 08:14:58

标签: c# xaml silverlight datagrid

我的DataGrid内有列。

我想让DataGrid 每3秒刷新一次,并使用服务中的数据。

我需要Scroll每次刷新时都不会跳到DataGrid的顶部,并且会Scroll停留在<sdk:DataGrid Grid.Row="1" FlowDirection="RightToLeft" ColumnHeaderHeight="32" AutoGenerateColumns="False" Name="RealTimeReportDataGrid" RowEditEnded="LinesDataGrid_RowEditEnded" RowHeight="40"> <sdk:DataGrid.Columns>...</sdk:DataGrid.Columns> </sdk:DataGrid> 的同一位置。有可能吗?

这是我的代码:

        public RealTimeReport()
    {
        InitializeComponent();
        Loaded += OnViewLoaded;
        RealTimeReportService.RealTimeReportServiceClient RTws = new RealTimeReportService.RealTimeReportServiceClient();
        RTws.GetRealTimeReportAsync();
        RTws.GetRealTimeReportCompleted += new EventHandler<RealTimeReportService.GetRealTimeReportCompletedEventArgs>(RTws_GetRealTimeReportCompleted);

    }

    void RTws_GetRealTimeReportCompleted(object sender, RealTimeReportService.GetRealTimeReportCompletedEventArgs e)
    {
        var t = e.Result.ToList();
        RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList());
    }


    private void OnViewLoaded(object sender, RoutedEventArgs e)
    {
        Start();
    }

    private void OnUpdaterTimerTick(object sender, EventArgs e)
    {
        RealTimeReportService.RealTimeReportServiceClient RTws = new RealTimeReportService.RealTimeReportServiceClient();
        RTws.GetRealTimeReportAsync();
        RTws.GetRealTimeReportCompleted += new EventHandler<RealTimeReportService.GetRealTimeReportCompletedEventArgs>(RTws_GetRealTimeReportCompleted);
    }


    public void Start()
    {
        InitializeRefreshDataTimer();
    }


    public void InitializeRefreshDataTimer()
    {
        _updaterTimer.Interval = new TimeSpan(0, 0, 0, 0, 3000);
        _updaterTimer.Tick += OnUpdaterTimerTick;
        _updaterTimer.Start();
    }

这是背后的代码:

void RTws_GetRealTimeReportCompleted(object sender, RealTimeReportService.GetRealTimeReportCompletedEventArgs e)
{
    var t = e.Result.ToList();

    RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList());

    this.RealTimeReportDataGrid.Dispatcher.BeginInvoke(() =>
    {
        RealTimeReportDataGrid.ScrollIntoView(
        RealTimeReportDataGrid.SelectedItem,
        RealTimeReportDataGrid.CurrentColumn);
    });
    //RealTimeReportDataGrid.ItemsSource = new System.Collections.ObjectModel.ObservableCollection<ShahalDialerRT.RealTimeReportService.RealTimeReport>(e.Result.ToList());
    //RealTimeReportDataGrid.UpdateLayout();
    //RealTimeReportDataGrid.ScrollIntoView(RealTimeReportDataGrid.SelectedItem, RealTimeReportDataGrid.Columns[0]);
}

非常感谢。

更新 @StepUp,这是我所做的唯一改变,根据你说的,但仍然没有变化:(

template<typename T>
void getValueFromString(QString str, T& returnVal)
{
    QTextStream stream(str);
    stream >> returnVal;
}

1 个答案:

答案 0 :(得分:2)

仅按use Timer class

每3秒刷新一次
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval=3000;
aTimer.Enabled=true;


// Specify what you want to happen when the Elapsed event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
     //add new data
}

Elapsed事件将每隔X秒引发一次,由Timer对象上的Interval属性以毫秒为单位指定。它将调用您指定的Event Handler方法,在上面的示例中为OnTimedEvent

Scroll保持在DataGrid中的相同位置:

yourDataGrid.ItemsSource = data; 
yourDataGrid.UpdateLayout(); 
yourDataGrid.ScrollIntoView(theDataGrid.SelectedItem, theDataGrid.Columns[0]);

<强>更新

yourDataGrid.Dispatcher.BeginInvoke(() =>
{
    yourDataGrid.Focus();      
    yourDataGrid.SelectedItem=whateverYouWant;
    yourDataGrid.CurrentColumn=yourDataGrid.Columns[0];
    yourDataGrid.ScrollIntoView(yourDataGrid.SelectedItem, yourDataGrid.CurrentColumn);
});

OR:

yourDataGrid.SelectedIndex = 5; // the index you want to select
yourDataGrid.UpdateLayout();
yourDataGrid.ScrollIntoView(Grid.SelectedItem, 0);