2008-11-26 6 views
1

J'essaie de définir l'ordre d'affichage initial des en-têtes de colonnes dans une grille de données silverlight en modifiant les valeurs DisplayIndex de l'en-tête de colonne. Si j'essaie de définir l'ordre des colonnes au moment du chargement de la page, j'obtiens une exception hors plage. Si je définis l'ordre des colonnes (même routine) à un moment ultérieur, comme dans un gestionnaire de clic sur un bouton, cela fonctionne. Est-ce juste un bug dans le contrôle de DataGrid Silverlight? Suggestions pour un possible travail autour?Silverlight DataGrid Exception Réorganisation des en-têtes de colonne

Répondre

1

Je suppose que vous avez rencontré un problème lors de la modification de l'indicateur DisplayIndex des colonnes du contrôle DataGrid à partir de l'événement Page Loaded car elles n'ont pas encore été créées à ce stade. Vous ne dites pas mais je suppose que vous obtenez le DataGrid pour AutoGenerate vos colonnes comme autrement vous pourriez juste définir le DisplayIndex dans votre XAML en définissant les colonnes DataGrid.

Lorsque le DataGrid génère des colonnes, il déclenche un événement AutoGeneratingColumn pour chaque colonne, ce qui vous permet de modifier ses propriétés. C'est un peu grossier mais une solution pourrait être de définir le DisplayIndex dans un gestionnaire pour cet événement en utilisant le PropertyName pour lequel il crée une colonne.

private void grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    switch (e.PropertyName) 
    { 
     case "Name": 
      e.Column.DisplayIndex = 1; 
      break; 

     case "Age": 
      e.Column.DisplayIndex = 0; 
      break; 
    } 
} 
+0

En cas n'importe qui se soucie toujours, oui: ce problème se produit également avec AutoGenerateColumns == false et non, dans ce cas, vous n'obtenez aucun événement AutoGeneratingColumn. Non, l'événement Loaded ne fonctionne pas non plus. Dans mon cas, j'ai résolu en manipulant l'événement LayoutUpdated et en mettant à jour les index d'affichage seulement quand ma longueur de ItemsSource est> 0. Bonne chance. –

0

en fait, vous devez vous abonner à l'événement grid.Loaded et réordonner colums là:

public UserManagementControl() 
    { 
     InitializeComponent(); 
     dataGridUsers.Loaded += new RoutedEventHandler(dataGridUsers_Loaded); 
    } 

    void dataGridUsers_Loaded(object sender, RoutedEventArgs e) 
    { 
     dataGridUsers.Columns[0].DisplayIndex = 1; 
    } 

Vous avez ArgumentOutOfRangeException parce que le contrôle n'a pas été chargé jusqu'à présent

0
/// <summary> 
/// Automation DataGrid Control - Columns Localization and Ordering 
/// Option1: Localization of Columns Automatically 
/// Option2: Ordering columns in DataGrid Automatically 
/// </summary> 
/// <param name="dataGrid"> DataGrid control</param> 
/// <param name="ContractType"> Contract of Row DataItem 
/// Example: typeof(ClientType) 
/// </param> 
/// <param name="columns"> Ordered Properties of Contract 
/// Example: columns = "Id_Client,Client,GeographyItem,Flag_Approved,ClientType,ClientRelation,ClientPrestigeLevel" 
/// </param> 
public void AutomateDataGridColumns(DataGrid dataGrid, Type Contract, String columns) 
{ 
    try 
    { 
     List<String> OrderedColumns = columns.Split(new string[] { ",", "|", ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); 

     //Buid Order of created COLUMNS 
     dataGrid.Loaded += (sndr, arg) => 
     { 
      if (dataGrid.Columns.Count == OrderedColumns.Count && dataGrid.AutoGenerateColumns == true)      
      { 
       foreach (var item in dataGrid.Columns) 
       { 
        Int32 displayIndex = OrderedColumns.IndexOf(item.Header.ToString()); 
        if (displayIndex != -1) 
        { item.DisplayIndex = displayIndex; }       
       } 
      }; 
     }; 

     //DataGridColumn Localization 
     dataGrid.AutoGeneratingColumn += (sndr, arg) => 
     { 
       LocalizeDataGridColumn(sndr as DataGrid, arg, Contract, OrderedColumns); 

       //We need To Update DataGrid after last Column Localized -->so Loaded event will be Raised/ 
       // or ArgumentOutOfRange Exception will be thrown 
       if (dataGrid.Columns.Count == OrderedColumns.Count && dataGrid.AutoGenerateColumns == true) 
       { 
        dataGrid.UpdateLayout(); 
       } 
     }; 

    }   
    catch (Exception exc) 
    { throw exc; 
    } 
} 



/// <summary> 
/// DataGridColumn Control Localization 
/// </summary> 
/// <param name="dataGrid">Host DataGrid control </param> 
/// <param name="arg">Auto Generated Column arg </param> 
/// <param name="Contract">Type Contract</param> 
/// <param name="localizationColumns">Ordered Properties to Contract </param> 
protected void LocalizeDataGridColumn(DataGrid dataGrid, DataGridAutoGeneratingColumnEventArgs arg, Type Contract, List<String> localizationColumns) 
{ 
    try 
    { 
     DataGridColumn Column = arg.Column; 

     if (localizationColumns.Contains(Column.Header.ToString())) 
     { 
      // LOCALIZING Column.Header      

      // Check column local resource key exist 
      // CultureKeys - local Culture enum type 
      // SystemDispatcher - is My SL4 MEF Bootstrappper 
      // LocalizationService - is My Localization service in SL4 
      // if somebody is interested i can share more of my LocalizationService - use mail  
      CultureKeys currntCulture = SystemDispatcher.LocalizationService.CurrentCulture; 
      string ResourceKey = LocalResKeys.BoPropElmNameLoc.ToString() + "\\" + Contract.Name + @"|" + Column.Header.ToString(); 

      if (SystemDispatcher.LocalizationService.CultureResources[currntCulture].Item2.ContainsKey(ResourceKey)) 
       Column.Header = SystemDispatcher.LocalizationService.CultureResources[currntCulture].Item2[ResourceKey];          
     } 
     else 
     { arg.Cancel = true; 
     } 
    } 
    catch (Exception exc) 
    { 
     throw exc; 
    } 

} 
Questions connexes