列ヘッダーの DisplayIndex 値を変更して、Silverlight データグリッドの列ヘッダーの初期表示順序を設定しようとしています。ページの読み込み時に列の順序を設定しようとすると、範囲外の例外が発生します。ボタンクリックハンドラーのように、後で列の順序(同じルーチン)を設定すると、機能します。これは Silverlight データグリッド コントロールの単なるバグですか? 可能な回避策の提案はありますか?
3789 次
3 に答える
1
この時点ではまだ作成されていないため、Page Loaded イベントから DataGrid の列の DisplayIndex を変更する際に問題が発生したと思います。あなたは言いませんが、DataGrid 列を定義するときに XAML で DisplayIndex を設定するだけでよいので、列を AutoGenerate するために DataGrid を取得していると思います。
DataGrid が列を生成すると、列ごとに AutoGeneratingColumn イベントが発生し、そのプロパティを変更できます。少し大雑把ですが、列を作成する PropertyName を使用して、このイベントのハンドラーで DisplayIndex を設定することが 1 つの解決策になる可能性があります。
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 に答える