Silverlight DataGrid异常重新排序列标题

Silverlight DataGrid异常重新排序列标题,silverlight,datagrid,Silverlight,Datagrid,我试图通过更改列标题DisplayIndex值来设置silverlight数据网格中列标题的初始显示顺序。如果我试图在页面加载时设置列顺序,我会得到一个超出范围的异常。如果我稍后设置列顺序(相同的例程),就像在按钮单击处理程序中一样,它会工作。这只是silverlight datagrid控件中的一个bug吗?关于可能的解决方法的建议?我猜您在修改数据网格中的列的显示索引时遇到了问题,因为此时尚未创建这些列。您没有说,但我假设您正在让DataGrid自动生成列,否则您可以在定义DataGrid列

我试图通过更改列标题DisplayIndex值来设置silverlight数据网格中列标题的初始显示顺序。如果我试图在页面加载时设置列顺序,我会得到一个超出范围的异常。如果我稍后设置列顺序(相同的例程),就像在按钮单击处理程序中一样,它会工作。这只是silverlight datagrid控件中的一个bug吗?关于可能的解决方法的建议?

我猜您在修改数据网格中的列的显示索引时遇到了问题,因为此时尚未创建这些列。您没有说,但我假设您正在让DataGrid自动生成列,否则您可以在定义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;
    }
}

我猜您在修改DataGrid中的PageLoaded事件中的列的DisplayIndex时遇到了问题,因为此时尚未创建这些列。您没有说,但我假设您正在让DataGrid自动生成列,否则您可以在定义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;
    }
}

实际上,您需要订阅grid.Loaded事件并在那里重新排序列:

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

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

您得到ArgumentOutOfRangeException,因为到目前为止尚未加载控件

实际上,您需要订阅网格。已加载事件并在那里对列重新排序:

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

    void dataGridUsers_Loaded(object sender, RoutedEventArgs e)
    {
        dataGridUsers.Columns[0].DisplayIndex = 1;
    }
/// <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;
    }

}
您得到ArgumentOutOfRangeException,因为到目前为止尚未加载控件
/// <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:自动定位列 ///选项2:在DataGrid中自动排序列 /// ///数据网格控制 ///行数据项的合同 ///示例:typeof(ClientType) /// ///合同的有序属性 ///示例:columns=“Id\u Client,Client,geographytem,Flag\u Approved,ClientType,ClientRelation,ClientPrestigeLevel” /// public void automatedatagrid列(DataGrid DataGrid,类型Contract,字符串列) { 尝试 { List OrderedColumns=columns.Split(新字符串[]{“,”,“|“,“;”},StringSplitOptions.RemoveEmptyEntries.ToList(); //创建列的构建顺序 dataGrid.Loaded+=(sndr,arg)=> { if(dataGrid.Columns.Count==OrderedColumns.Count&&dataGrid.AutoGenerateColumns==true) { foreach(dataGrid.Columns中的var项) { Int32 displayIndex=OrderedColumns.IndexOf(item.Header.ToString()); 如果(显示索引!=-1) {item.DisplayIndex=DisplayIndex;} } }; }; //DataGridColumn本地化 dataGrid.AutoGeneratingColumn+=(sndr,arg)=> { 本地化DataGridColumn(sndr作为DataGrid、arg、Contract、OrderedColumns); //我们需要在最后一列本地化-->之后更新DataGrid,以便引发加载的事件/ //或ArgumentOutOfRange异常将被抛出 if(dataGrid.Columns.Count==OrderedColumns.Count&&dataGrid.AutoGenerateColumns==true) { dataGrid.UpdateLayout(); } }; } 捕获(异常exc) {exc; } } /// ///DataGridColumn控件本地化 /// ///主机数据网格控制 ///自动生成的列参数 ///类型合同 ///订购物业以进行合约 受保护的void LocalizeDataGridColumn(DataGrid DataGrid、DataGridAutoGeneratingColumnEventArgs arg、类型协定、列表localizationColumns) { 尝试 { DataGridColumn=arg.Column; if(localizationColumns.Contains(Column.Header.ToString())) { //本地化列.标题 //检查列本地资源键是否存在 //CultureKeys-本地文化枚举类型 //SystemDispatcher-是我的SL4 MEF引导程序 //本地化服务-是我在SL4中的本地化服务 //如果有人感兴趣,我可以分享更多我的本地化服务-使用邮件 CultureKeys CurrentCulture=SystemDispatcher.LocalizationService.CurrentCulture; string ResourceKey=LocalResKeys.BoPropElmNameLoc.ToString()+“\\”+Contract.Name++@“\\”+Column.Header.ToString(); if(SystemDispatcher.LocalizationService.CultureResources[CurrentCulture].Item2.ContainsKey(ResourceKey)) Column.Header=SystemDispatcher.LocalizationService.CultureResources[CurrentCulture].Item2[ResourceKey]; } 其他的 {arg.Cancel=true; } } 捕获(异常exc) { 抛出exc; } }
//
///自动化数据网格控制-列本地化和排序
///选项1:自动定位列
///选项2:在DataGrid中自动排序列
/// 
///数据网格控制
///行数据项的合同
///示例:typeof(ClientType)
/// 
///合同的有序属性
///示例:columns=“Id\u Client,Client,geographytem,Flag\u Approved,ClientType,ClientRelation,ClientPrestigeLevel”
/// 
public void automatedatagrid列(DataGrid DataGrid,类型控制