Silverlight DataGrid异常重新排序列标题
我试图通过更改列标题DisplayIndex值来设置silverlight数据网格中列标题的初始显示顺序。如果我试图在页面加载时设置列顺序,我会得到一个超出范围的异常。如果我稍后设置列顺序(相同的例程),就像在按钮单击处理程序中一样,它会工作。这只是silverlight datagrid控件中的一个bug吗?关于可能的解决方法的建议?我猜您在修改数据网格中的列的显示索引时遇到了问题,因为此时尚未创建这些列。您没有说,但我假设您正在让DataGrid自动生成列,否则您可以在定义DataGrid列时在XAML中设置DisplayIndex 当DataGrid生成列时,它会为每个列触发一个AutoGeneratingColumn事件,允许您修改其属性。这有点粗糙,但一种解决方案可能是使用它正在为其创建列的PropertyName在处理程序中为此事件设置DisplayIndexSilverlight DataGrid异常重新排序列标题,silverlight,datagrid,Silverlight,Datagrid,我试图通过更改列标题DisplayIndex值来设置silverlight数据网格中列标题的初始显示顺序。如果我试图在页面加载时设置列顺序,我会得到一个超出范围的异常。如果我稍后设置列顺序(相同的例程),就像在按钮单击处理程序中一样,它会工作。这只是silverlight datagrid控件中的一个bug吗?关于可能的解决方法的建议?我猜您在修改数据网格中的列的显示索引时遇到了问题,因为此时尚未创建这些列。您没有说,但我假设您正在让DataGrid自动生成列,否则您可以在定义DataGrid列
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,类型控制