2009-07-15 13 views
2

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:

Big Red X

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?

+0

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

Répondre

2

Je ne suis pas trop haut sur WinForms et n'ai jamais utilisé Infragistics Ultragrid. Ma supposition serait que La liste des enfants pour le champ DiscoverData ([Build] = '4) est lancée en profondeur dans le cadre de certains des codes de liaison de données et semble rechercher les membres enfants d'une classe appelée ([ construire] = « 4 qu'il arrête au point ou point (.) dans votre chaîne littérale.

J'essaie d'éviter de travailler avec DataSet s et DataView s en raison de quelques-uns des cerceaux fous, ils sautent à travers.

Peut être utile d'allumer le réflecteur et d'avoir un poke autour System.Windows.Forms.BindingContext

0

Chec k vous DataBindings.

Le problème est souvent dû à votre chemin de liaison. Si vous avez quelque chose comme ceci:

labelFirstName.DataBindings.Add("Text", "_Person.Info.FName", true, DataSourceUpdateMode.OnPropertyChanged); 

vous aurez probablement à le mettre à jour à une autre surcharge Ajouter méthode:

labelFirstName.DataBindings.Add("Text", _Person.Info, "FName", true, DataSourceUpdateMode.OnPropertyChanged);