internal bool CanRemove(DataColumn?column, bool fThrowException)
{
if (column == null)
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.ArgumentNull(nameof(column));
}
}
if (column._table != _table)
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemoveColumn();
}
}
// allow subclasses to complain first.
_table.OnRemoveColumnInternal(column);
// We need to make sure the column is not involved in any Relations or Constriants
if (_table._primaryKey != null && _table._primaryKey.Key.ContainsColumn(column))
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemovePrimaryKey();
}
}
for (int i = 0; i < _table.ParentRelations.Count; i++)
{
if (_table.ParentRelations[i].ChildKey.ContainsColumn(column))
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemoveChildKey(_table.ParentRelations[i].RelationName);
}
}
}
for (int i = 0; i < _table.ChildRelations.Count; i++)
{
if (_table.ChildRelations[i].ParentKey.ContainsColumn(column))
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemoveChildKey(_table.ChildRelations[i].RelationName);
}
}
}
for (int i = 0; i < _table.Constraints.Count; i++)
{
if (_table.Constraints[i].ContainsColumn(column))
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemoveConstraint(_table.Constraints[i].ConstraintName, _table.Constraints[i].Table !.TableName);
}
}
}
if (_table.DataSet != null)
{
for (ParentForeignKeyConstraintEnumerator en = new ParentForeignKeyConstraintEnumerator(_table.DataSet, _table); en.GetNext();)
{
Constraint constraint = en.GetConstraint();
if (((ForeignKeyConstraint)constraint).ParentKey.ContainsColumn(column))
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemoveConstraint(constraint.ConstraintName, constraint.Table !.TableName);
}
}
}
}
if (column._dependentColumns != null)
{
for (int i = 0; i < column._dependentColumns.Count; i++)
{
DataColumn col = column._dependentColumns[i];
if (_fInClear && (col.Table == _table || col.Table == null))
{
continue;
}
if (col.Table == null)
{
continue;
}
Debug.Assert(col.Computed, "invalid (non an expression) column in the expression dependent columns");
DataExpression?expr = col.DataExpression;
if ((expr != null) && (expr.DependsOn(column)))
{
if (!fThrowException)
{
return(false);
}
else
{
throw ExceptionBuilder.CannotRemoveExpression(col.ColumnName, col.Expression);
}
}
}
}
// you can't remove a column participating in an index,
// while index events are suspended else the indexes won't be properly maintained.
// However, all the above checks should catch those participating columns.
// except when a column is in a DataView RowFilter or Sort clause
foreach (Index _ in _table.LiveIndexes)
{
}
return(true);
}