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
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;
}
}
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
/// <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;
}
}
- 1. WPG DataGrid: Réorganisation des lignes?
- 2. WPF Listview: événement de réorganisation de colonne?
- 3. SilverLight Datagrid
- 4. Silverlight datagrid défilement synchronisé
- 5. Silverlight DataGrid Control - Comment arrêter le tri sur une colonne?
- 6. Silverlight DataGrid Redraw Numéro
- 7. Puis-je détecter une colonne DataGrid triée dans Silverlight?
- 8. silverlight 3 Personnalisation de l'en-tête Datagrid
- 9. En-têtes DataGrid Silverlight 2
- 10. Flex DataGrid Largeur de colonne
- 11. Style Silverlight DataGrid
- 12. Silverlight DataGrid - Ajouter des colonnes à l'exécution
- 13. deux datagrid dans silverlight
- 14. SQL Mass Réorganisation des lignes
- 15. Itère un DataGrid Silverlight
- 16. ITemplate et DataGrid Colonne Codebehind
- 17. Mettre en évidence des lignes entières uniquement dans Silverlight DataGrid
- 18. WPF DataGrid Bouton Colonne Désactiver
- 19. Définir l'ordre de tri initial dans Silverlight DataGrid?
- 20. Largeur de colonne Flex 3 DataGrid Problème
- 21. Commande de colonne DataGrid dans ActionScript
- 22. Réorganisation de l'événement dans FLEX
- 23. Comment ajouter manuellement des données à un DataGrid dans Silverlight
- 24. Silverlight 2.0 DataGrid Comment supprimer l'effet mouseover
- 25. WPF DataGrid Colonne ComboBox: Propagating Header Combobox dans la colonne
- 26. PgSQL Exception: nom de colonne introuvable
- 27. ASP.NET Datagrid - masquer une ligne/colonne spécifique
- 28. Réorganisation des cellules animées dans un NSTableView
- 29. Les événements Silverlight DataGrid Checkbox sont-ils?
- 30. Silverlight DataGrid Actualiser entre fichiers Xaml
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. –