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