dotnet/wpf · error · ArgumentNullException

SR.DataGrid_NullColumn

Error message

SR.DataGrid_NullColumn

What it means

DataGridColumnCollection.InsertItem throws ArgumentNullException with DataGrid_NullColumn when a null DataGridColumn is inserted into the grid's Columns collection. The collection refuses null entries to keep the column list well-formed.

Solutions

  1. Check columns for null before adding; fix the source that produced null
  2. Filter nulls: columns.Where(c => c != null)
  3. Validate factory/parse code that constructs DataGridColumn instances
  4. Create and add a concrete column (DataGridTextColumn, etc.) instead of null

Example fix

// before
grid.Columns.Add(GetColumn()); // GetColumn() may return null
// after
var col = GetColumn();
if (col != null) grid.Columns.Add(col);
Defensive patterns

Strategy: validation

Validate before calling

if (columns.Any(c => c == null))
    throw new InvalidOperationException("Column list contains null entries before adding to DataGrid.");

Type guard

bool IsAddable(DataGridColumn c) => c != null && c.DataGridOwner == null;

Prevention

When it happens

Trigger: Calling dataGrid.Columns.Add(null), Columns.Insert(index, null), or adding a collection containing null columns; data binding a column list that contains nulls.

Common situations: Building column lists dynamically where a factory returned null; deserializing column definitions with missing entries; initializer syntax with a failed constructor returning null via helper method.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/aaebd1cf138d4d6f. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/DataGridColumnCollection.cs:40

            DisplayIndexMap = new List<int>(5);
            _dataGridOwner = dataGridOwner;

            RealizedColumnsBlockListForNonVirtualizedRows = null;
            RealizedColumnsDisplayIndexBlockListForNonVirtualizedRows = null;
            RebuildRealizedColumnsBlockListForNonVirtualizedRows = true;

            RealizedColumnsBlockListForVirtualizedRows = null;
            RealizedColumnsDisplayIndexBlockListForVirtualizedRows = null;
            RebuildRealizedColumnsBlockListForVirtualizedRows = true;
        }

        #region Protected Overrides

        protected override void InsertItem(int index, DataGridColumn item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item), SR.DataGrid_NullColumn);
            }

            if (item.DataGridOwner != null)
            {
                throw new ArgumentException(SR.Format(SR.DataGrid_InvalidColumnReuse, item.Header), nameof(item));
            }

            if (DisplayIndexMapInitialized)
            {
                ValidateDisplayIndex(item, item.DisplayIndex, true);
            }

            base.InsertItem(index, item);
            item.CoerceValue(DataGridColumn.IsFrozenProperty);
        }

        protected override void SetItem(int index, DataGridColumn item)
        {

View on GitHub (pinned to 81131a70a4)