1

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

4

3 回答 3

1

我猜您在从 Page Loaded 事件修改 DataGrid 中的列的 DisplayIndex 时遇到问题,因为此时尚未创建它们。您没有说,但我假设您正在让 DataGrid 自动生成列,否则您可以在定义 DataGrid 列时在 XAML 中设置 DisplayIndex。

当 DataGrid 生成 Columns 时,它会为每个 Column 触发一个 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;
    }
}
于 2008-12-05T12:26:55.893 回答
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;
    }

}
于 2011-11-10T13:36:52.927 回答
0

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

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

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

你有 ArgumentOutOfRangeException 因为到目前为止还没有加载控件

于 2010-02-19T09:54:04.123 回答