Mon application codée C# utilise Infragistics.Win.UltraWinGrid.UltraGrid pour afficher certaines données. Les données sont essentiellement une collection d'ordinateurs. L'application est capable de filtrer ces ordinateurs (comme "stations de travail", "serveurs", etc) pour l'affichage. Voici comment je filtre:Que signifie "Liste d'enfants pour le champ ... ne peut pas être créé"?
private DataView FilterTableDataForViewing(DataTable originalTable, string filterString, UltraGrid viewGrid)
{
DataView dataView = new DataView(originalTable);
dataView.RowStateFilter = DataViewRowState.CurrentRows;
dataView.RowFilter = filterString;
DataTable filteredTable = dataView.ToTable(originalTable.TableName + "_" + dataView.RowFilter);
viewGrid.DataSource = filteredTable;
gridDiscoveryMain.DisplayLayout.ViewStyleBand = ViewStyleBand.OutlookGroupBy;
SetFlagImagesAndColumnWidthsOfDiscoveryGrid();
return dataView;
}
Notez que je mets le nom de la table à une chaîne de filtre potentiellement énorme.
Voilà comment j'utilise la méthode ci-dessus:
string filterString = "([Build] = '4.0' AND NOT([OS Plus Version] LIKE '%Server%'))";
filterString += " OR ([Build] = '4.10')";
filterString += " OR ([Build] = '4.90')";
filterString += " OR ([Build] = '5.0' AND NOT([OS Plus Version] LIKE '%Server%'))";
filterString += " OR ([Build] = '5.1')";
filterString += " OR ([Build] = '6.0' AND ";
filterString += "(NOT([OS Plus Version] LIKE '%Server%')) OR (NOT([OS] LIKE '%Server%')))";
FilterTableDataForViewing(dataSet.Tables["DiscoveryData"], filterString, gridDiscoveryMain);
Tout jusqu'à ce point est très bien. UltraGrids dispose d'une fonction qui vous permet de choisir les colonnes que vous souhaitez masquer et de créer de nouvelles colonnes personnalisées. Lorsque cette fonction est démarrée, un événement de l'UltraGrid appelé BeforeColumnChooserDisplayed
est déclenché. Voici mon gestionnaire:
private void gridDiscoveryMain_BeforeColumnChooserDisplayed(object sender, BeforeColumnChooserDisplayedEventArgs e)
{
if (gridDiscoveryMain.DataSource == null)
return;
e.Cancel = true;
gridDiscoveryMain.DisplayLayout.Override.RowSelectors = DefaultableBoolean.True;
gridDiscoveryMain.DisplayLayout.Override.RowSelectorHeaderStyle = RowSelectorHeaderStyle.ColumnChooserButton;
ShowCustomColumnChooserDialog();
this.customColumnChooserDialog.CurrentBand = e.Dialog.ColumnChooserControl.CurrentBand;
this.customColumnChooserDialog.ColumnChooserControl.Style = ColumnChooserStyle.AllColumnsWithCheckBoxes;
}
Et voici la mise en œuvre de la méthode ShowCustomColumnChooserDialog
:
private void ShowCustomColumnChooserDialog()
{
DataTable originalTable = GetUnderlyingDataSource(gridDiscoveryMain);
if (this.customColumnChooserDialog == null || this.customColumnChooserDialog.IsDisposed)
{
customColumnChooserDialog = new CustomColumnChooser(ManageColumnDeleted);
customColumnChooserDialog.Owner = Parent.FindForm();
customColumnChooserDialog.Grid = gridDiscoveryMain;
}
this.customColumnChooserDialog.Show();
}
customColumnChooserDialog est essentiellement une forme qui ajoute un peu plus à la valeur par défaut Infragistics un. La chose la plus importante que son code prend soin de cette méthode est:
private void InitializeBandsCombo(UltraGridBase grid)
{
this.ultraComboBandSelector.SetDataBinding(null, null);
if (null == grid)
return;
// Create the data source that we can bind to UltraCombo for displaying
// list of bands. The datasource will have two columns. One that contains
// the instances of UltraGridBand and the other that contains the text
// representation of the bands.
UltraDataSource bandsUDS = new UltraDataSource();
bandsUDS.Band.Columns.Add("Band", typeof(UltraGridBand));
bandsUDS.Band.Columns.Add("DisplayText", typeof(string));
foreach (UltraGridBand band in grid.DisplayLayout.Bands)
{
if (! this.IsBandExcluded(band))
{
bandsUDS.Rows.Add(new object[] { band, band.Header.Caption });
}
}
this.ultraComboBandSelector.DisplayMember = "DisplayText";
this.ultraComboBandSelector.ValueMember= "Band";
this.ultraComboBandSelector.SetDataBinding(bandsUDS, null);
// Hide the Band column.
this.ultraComboBandSelector.DisplayLayout.Bands[0].Columns["Band"].Hidden = true;
// Hide the column headers.
this.ultraComboBandSelector.DisplayLayout.Bands[0].ColHeadersVisible = false;
// Set some properties to improve the look & feel of the ultra combo.
this.ultraComboBandSelector.DropDownWidth = 0;
this.ultraComboBandSelector.DisplayLayout.Override.HotTrackRowAppearance.BackColor = Color.LightYellow;
this.ultraComboBandSelector.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
this.ultraComboBandSelector.DisplayLayout.BorderStyle = UIElementBorderStyle.Solid;
this.ultraComboBandSelector.DisplayLayout.Appearance.BorderColor = SystemColors.Highlight;
}
Si je fais un pas dans le code, il est tout frais jusqu'à ce que je quitte le gestionnaire d'événements (le point où le contrôle revient à la forme). Je reçois une ArgumentException lancé seulement lorsque j'essaie d'afficher la boîte de dialogue CustomColumnChooser à partir d'une grille qui affiche les données filtrées. Pas le genre qui montre la ligne fautive dans votre code, mais le type qui fait apparaître une boîte de message d'erreur "Microsoft .NET Framework" qui dit "Une exception non gérée s'est produite dans votre application ...". Cela signifie que je ne peux pas savoir ce qui le cause. L'application ne se désagrège pas après, mais la boîte de dialogue CustomColumnChooser serait-être livré avec le récipient contenant rien, mais un fond blanc et un grand « X » rouge:
Et la trace de la pile: Voir la fin de ce message pour plus de détails sur l'appel du débogage juste-à-temps (JIT) au lieu de cette boîte de dialogue.
************** Exception Text ************** System.ArgumentException: Liste d'enfants pour le champ DiscoveryData _ ([Build] = ' 4 ne peut pas être créé à System.Windows.Forms.BindingContext.EnsureListManager (Object dataSource, String dataMember) à System.Windows.Forms.BindingContext.EnsureListManager (Object dataSource, String dataMember) à System.Windows.Forms.BindingContext .EnsureListManager (Object dataSource, String DataMember) à System.Windows.Forms.BindingContext.EnsureListManager (Object dataSource, String DataMember) à System.Windows.Forms.BindingContext.EnsureListManager (Object dataSource, String DataMember) à System.Windows .Forms.BindingContext.E nsureListManager (Object dataSource, String dataMember) à System.Windows.Forms.BindingContext.EnsureListManager (Object dataSource, String dataMember) à System.Windows.Forms.BindingContext.get_Item (Object dataSource, String dataMember) à Infragistics.Win.UltraWinGrid.UltraGridLayout.ListManagerUpdated (BindingManagerBase bindingManager) à Infragistics.Win.UltraWinGrid.UltraGridLayout.ListManagerUpdated() à Infragistics.Win.UltraWinGrid.UltraGridBase.Set_ListManager (Object newDataSource, String newDataMember) à Infragistics.Win.UltraWinGrid.UltraGridBase. SetDataBindingHelper (Object dataSource, String DataMember, hideNewColumns booléennes, booléens hideNewBands) à Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBinding (Object dataSource, String DataMember, booléens hideNewColumns, booléens hideNewBands) à Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBinding (Object dataSource, String dataMember, Boolean hideNewColumns) à Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBinding (Object dataSource, Chaîne dataMember) à Infragistics.Win.UltraWinGrid.UltraGridColumnChooser.CreateColumnChooserGridDataStructure() à Infragistics.Win.UltraWinGrid.UltraGridColumnChooser.Initialize() à Infragistics.Win.UltraWinGrid.UltraGridColumnChooser.VerifyInitialized() à Infragistics.Win.UltraWinGrid.ColumnChooserGridCreationFilter.BeforeCreateChildElements (parent UIElement) à Infragistics.Win.UIElement.VerifyChildElements (ControlUIElementBase controlElement, récursif Boolean) à Infragistics.Win.UltraWinGrid.UltraGridUIElement.VerifyChildElements (ControlUIElementBase controlElement, récursif Boolean) à Infragistics.Win.UIElement.VerifyChildElements (récursive booléen) à Infragistics.Win.UltraWinGrid.UltraGridUIElement.InternalInitializeRect (Boolean verify) à Infragistics.Win.UltraWinGrid.UltraGridLayout.GetUIElement (booléen vérifier, Boolean forceInitializeRect) à Infragistics.Win.UltraWinGrid.UltraGrid.OnPaint (PaintEventArgs pe) à System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgse, couche Int16 booléennes, disposeEventArgs) à System.Windows.Forms.Control.WmPaint (message & m) à System.Windows.Forms.Control.WndProc (message & m) à System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) à System.Windows.Forms.Control.ControlNativeWindow.WndProc (message & m) à System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
La liste d'enfants pour le champ DiscoveryData ([Build] = '4 ne peut pas être créé n'est pas très utile. Qu'est-ce que cela signifie vraiment?
Eh bien, j'évité l'exception d'être jeté en ne faisant pas le nom du DataTable cette longue chaîne de filtre compliquée. J'avais besoin de garder une trace de la façon dont je filtrais pour une autre fonctionnalité donc les implications de ce changement étaient gargantuesque :( Je suppose que quelque chose n'a pas aimé tous les caractères spéciaux? Je voudrais encore savoir exactement quoi " La liste des enfants pour le champ ... ne peut pas être créée "signifie ... – Corpsekicker