Исключение переупорядочения заголовков столбцов в Silverlight DataGrid - PullRequest
1 голос
/ 26 ноября 2008

Я пытаюсь установить начальный порядок отображения заголовков столбцов в сетке данных silverlight, изменяя значения DisplayIndex заголовка столбца. Если я пытаюсь установить порядок столбцов во время загрузки страницы, я получаю исключение вне диапазона. Если я установлю порядок столбцов (та же самая рутина) позже, как, в обработчике щелчка кнопки, это работает. Это просто ошибка в элементе управления сеткой данных Silverlight? Предложения по возможному обходу?

Ответы [ 3 ]

1 голос
/ 05 декабря 2008

Я предполагаю, что у вас есть проблема при изменении DisplayIndex столбцов в DataGrid из события Page Loaded, так как они еще не были созданы на данный момент. Вы не говорите, но я предполагаю, что вы получаете DataGrid для автоматического создания ваших столбцов, иначе вы можете просто установить DisplayIndex в своем XAML при определении столбцов DataGrid.

Когда DataGrid генерирует Столбцы, он запускает событие AutoGeneratingColumn для каждого Столбца, позволяя вам изменять его свойства. Это немного грубо, но одним из решений может быть установка DisplayIndex в обработчике для этого события, используя PropertyName, для которого он создает столбец.

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 голосов
/ 10 ноября 2011
/// <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;
    }

}
0 голосов
/ 19 февраля 2010

на самом деле вам нужно подписаться на grid.Loaded событие и изменить порядок столбцов там:

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

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

У вас есть ArgumentOutOfRangeException, потому что элемент управления не был загружен до сих пор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...