title: What does "Child list for field ... cannot be created" mean?
body: <p>My C# coded application uses an Infragistics.Win.UltraWinGrid.UltraGrid to display some data. The data is basically a collection of computers. The application is able to filter these computers (like "Workstations", "Servers" etc) for viewing. This is how I filter:</p>
  
  <pre><code>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;
      }
  </code></pre>
  
  <p><strong>Note that I set the table name to a potentially huge filter string.</strong></p>
  
  <p>This is how I use the above method:</p>
  
  <pre><code>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);
  </code></pre>
  
  <p>Everything upto that point is fine. UltraGrids have a facility that allows you to choose which columns you want hidden and create new custom columns. When this facility is started an event of the UltraGrid called <code>BeforeColumnChooserDisplayed</code>  is fired. Here's my handler:</p>
  
  <pre><code>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;
      }
  </code></pre>
  
  <p>And here is the <code>ShowCustomColumnChooserDialog</code> method implementation:</p>
  
  <pre><code>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();
      }
  </code></pre>
  
  <p>customColumnChooserDialog is basically a form which adds a little extra to the Infragistics default one. The most important thing that it's code takes care of is this method:</p>
  
  <pre><code>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 &amp; 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;
      }
  </code></pre>
  
  <p>If I step through the code, it's all cool until I exit the event handler (the point at which the control returns to the form). I get an ArgumentException thrown at me <strong>only</strong> when I try and show the CustomColumnChooser dialog from a grid that displays <strong>filtered data</strong>. Not the kind that shows the offending line in your code, but the type that brings up a "Microsoft .NET Framework" error message box that says "Unhandled exception has occurred in your application...". This means I can't trace what's causing it. The app doesn't fall apart after that, but the would-be CustomColumnChooser dialog comes up with the container containing nothing but a white background and a big red "X".</p>
  
  <p>And the stack trace:</p>
  
  <pre><code>See the end of this message for details on invoking 
  just-in-time (JIT) debugging instead of this dialog box.
  
  ************** Exception Text **************
  System.ArgumentException: Child list for field DiscoveryData_([Build] = '4 cannot be created.
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)
     at System.Windows.Forms.BindingContext.get_Item(Object dataSource, String dataMember)
     at Infragistics.Win.UltraWinGrid.UltraGridLayout.ListManagerUpdated(BindingManagerBase bindingManager)
     at Infragistics.Win.UltraWinGrid.UltraGridLayout.ListManagerUpdated()
     at Infragistics.Win.UltraWinGrid.UltraGridBase.Set_ListManager(Object newDataSource, String newDataMember)
     at Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBindingHelper(Object dataSource, String dataMember, Boolean hideNewColumns, Boolean hideNewBands)
     at Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBinding(Object dataSource, String dataMember, Boolean hideNewColumns, Boolean hideNewBands)
     at Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBinding(Object dataSource, String dataMember, Boolean hideNewColumns)
     at Infragistics.Win.UltraWinGrid.UltraGridBase.SetDataBinding(Object dataSource, String dataMember)
     at Infragistics.Win.UltraWinGrid.UltraGridColumnChooser.CreateColumnChooserGridDataStructure()
     at Infragistics.Win.UltraWinGrid.UltraGridColumnChooser.Initialize()
     at Infragistics.Win.UltraWinGrid.UltraGridColumnChooser.VerifyInitialized()
     at Infragistics.Win.UltraWinGrid.ColumnChooserGridCreationFilter.BeforeCreateChildElements(UIElement parent)
     at Infragistics.Win.UIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
     at Infragistics.Win.UltraWinGrid.UltraGridUIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
     at Infragistics.Win.UIElement.VerifyChildElements(Boolean recursive)
     at Infragistics.Win.UltraWinGrid.UltraGridUIElement.InternalInitializeRect(Boolean verify)
     at Infragistics.Win.UltraWinGrid.UltraGridLayout.GetUIElement(Boolean verify, Boolean forceInitializeRect)
     at Infragistics.Win.UltraWinGrid.UltraGrid.OnPaint(PaintEventArgs pe)
     at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
     at System.Windows.Forms.Control.WmPaint(Message&amp; m)
     at System.Windows.Forms.Control.WndProc(Message&amp; m)
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
     at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  </code></pre>
  
  <p><strong>Child list for field DiscoveryData([Build] = '4 cannot be created</strong> is not very helpful. What does it really mean?</p>