2008-11-26 77 views
1

我想通过更改列标题DisplayIndex值来设置Silverlight数据网格中列标题的初始显示顺序。如果我尝试在页面加载时设置列顺序,则会出现超出范围的异常。如果我稍后设置列顺序(相同的例程),就像在按钮点击处理程序中一样,它可以工作。这只是Silverlight数据网格控件中的一个错误?建议可能的解决方法?Silverlight DataGrid异常重新排序列标题

回答

1

我猜你从页面加载事件中修改DataGrid中列的DisplayIndex时出现问题,因为它们尚未在此时创建。你不会说,但我假设你得到的DataGrid AutoGenerate你的列,否则你可以在定义DataGrid列时在你的XAML中设置DisplayIndex。

当DataGrid生成列时,它为每个列引发一个AutoGeneratingColumn事件,允许您修改其属性。这有点粗糙,但一种解决方案可能是使用为其创建列的PropertyName在此事件的处理程序中设置DisplayIndex。

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

在装情况下,任何人仍然在意,是的:这个问题也会出现AutoGenerateColumns == false和no,在这种情况下,你不会得到任何AutoGeneratingColumn事件。不,Loaded事件也不起作用。在我的情况下,我通过处理LayoutUpdated事件并仅在我的ItemsSource长度> 0时更新显示索引来解决。祝您好运。 – 2015-02-09 10:47:39

0

其实你需要订阅grid.Loaded事件和重排colums有:

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

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

你有ArgumentOutOfRangeException因为控制尚未到目前为止

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; 
    } 

}