@@ -51,6 +51,7 @@ public partial class ServerTab : UserControl
5151 private bool _isRefreshing ;
5252 private DateTime _refreshStartedUtc ;
5353 private bool _suppressPickerUpdates ;
54+ private readonly HashSet < string > _initializedTabs = new ( ) ;
5455
5556 // Filter state dictionaries for each DataGrid
5657
@@ -424,6 +425,7 @@ public void CleanupOnClose()
424425 _autoRefreshCts ? . Cancel ( ) ;
425426 _autoRefreshTimer ? . Stop ( ) ;
426427 _autoRefreshTimer = null ;
428+ _initializedTabs . Clear ( ) ;
427429
428430 Helpers . ThemeManager . ThemeChanged -= OnThemeChanged ;
429431 Loaded -= ServerTab_Loaded ;
@@ -549,7 +551,8 @@ private async void ServerTab_KeyDown(object sender, System.Windows.Input.KeyEven
549551 if ( e . Key == System . Windows . Input . Key . F5 )
550552 {
551553 e . Handled = true ;
552- await LoadDataAsync ( ) ;
554+ bool fullRefresh = System . Windows . Input . Keyboard . Modifiers . HasFlag ( System . Windows . Input . ModifierKeys . Control ) ;
555+ await LoadDataAsync ( fullRefresh ) ;
553556 }
554557 else if ( e . Key == System . Windows . Input . Key . V &&
555558 System . Windows . Input . Keyboard . Modifiers == System . Windows . Input . ModifierKeys . Control &&
@@ -640,7 +643,7 @@ private async void ServerTab_Loaded(object sender, RoutedEventArgs e)
640643 CriticalIssuesTab . SetTimeRange ( _globalHoursBack , _globalFromDate , _globalToDate ) ;
641644 DefaultTraceTab . SetTimeRange ( _globalHoursBack , _globalFromDate , _globalToDate ) ;
642645
643- await LoadDataAsync ( ) ;
646+ await LoadDataAsync ( fullRefresh : false ) ;
644647 SetupAutoRefresh ( ) ;
645648 }
646649 catch ( Exception ex )
@@ -654,7 +657,8 @@ private async void RefreshButton_Click(object sender, RoutedEventArgs e)
654657 {
655658 try
656659 {
657- await LoadDataAsync ( ) ;
660+ bool fullRefresh = System . Windows . Input . Keyboard . Modifiers . HasFlag ( System . Windows . Input . ModifierKeys . Control ) ;
661+ await LoadDataAsync ( fullRefresh ) ;
658662 }
659663 catch ( Exception ex )
660664 {
@@ -1271,34 +1275,37 @@ private async Task RefreshAllTabsAsync()
12711275 }
12721276
12731277 /// <summary>
1274- /// Refreshes only the currently visible tab — used on auto-refresh timer tick.
1278+ /// Refreshes only the currently visible tab. On first visit to a tab,
1279+ /// does a full refresh so all sub-tabs are populated. Subsequent visits
1280+ /// only refresh the active sub-tab for speed.
12751281 /// </summary>
12761282 private async Task RefreshVisibleTabAsync ( )
12771283 {
12781284 var selectedTab = DataTabControl . SelectedItem as TabItem ;
12791285 if ( selectedTab == null ) return ;
12801286
12811287 var tabHeader = GetTabHeaderText ( selectedTab ) ;
1288+ bool firstVisit = _initializedTabs . Add ( tabHeader ) ;
12821289
12831290 switch ( tabHeader )
12841291 {
12851292 case "Overview" :
12861293 await RefreshOverviewTabAsync ( ) ;
12871294 break ;
12881295 case "Queries" :
1289- await RefreshQueriesTabAsync ( fullRefresh : false ) ;
1296+ await RefreshQueriesTabAsync ( fullRefresh : firstVisit ) ;
12901297 break ;
12911298 case "Resource Metrics" :
1292- await RefreshResourceMetricsTabAsync ( fullRefresh : false ) ;
1299+ await RefreshResourceMetricsTabAsync ( fullRefresh : firstVisit ) ;
12931300 break ;
12941301 case "Memory" :
1295- await RefreshMemoryTabAsync ( fullRefresh : false ) ;
1302+ await RefreshMemoryTabAsync ( fullRefresh : firstVisit ) ;
12961303 break ;
12971304 case "Locking" :
12981305 await RefreshLockingTabAsync ( ) ;
12991306 break ;
13001307 case "System Events" :
1301- await RefreshSystemEventsTabAsync ( fullRefresh : false ) ;
1308+ await RefreshSystemEventsTabAsync ( fullRefresh : firstVisit ) ;
13021309 break ;
13031310 // Plan Viewer has no data to refresh
13041311 }
0 commit comments