Index: /trunk/sources/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs
===================================================================
--- /trunk/sources/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 5149)
+++ /trunk/sources/HeuristicLab.Analysis/3.3/DataVisualization/DataTable.cs	(revision 5150)
@@ -128,4 +128,6 @@
       foreach (DataRow row in e.Items)
         this.RegisterRowEvents(row);
+
+      this.OnColumnsChanged();
       this.OnColumnNamesChanged();
       this.OnReset();
@@ -134,4 +136,6 @@
       foreach (DataRow row in e.Items)
         this.DeregisterRowEvents(row);
+
+      this.OnColumnsChanged();
       this.OnColumnNamesChanged();
       this.OnReset();
@@ -142,4 +146,6 @@
       foreach (DataRow row in e.Items)
         this.RegisterRowEvents(row);
+
+      this.OnColumnsChanged();
       this.OnColumnNamesChanged();
       this.OnReset();
@@ -150,4 +156,7 @@
       foreach (DataRow row in e.Items)
         this.RegisterRowEvents(row);
+
+      if (e.OldItems.Count() != e.Items.Count())
+        this.OnColumnsChanged();
       this.OnColumnNamesChanged();
       this.OnReset();
@@ -239,4 +248,14 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+    public event EventHandler ColumnsChanged;
+    protected virtual void OnColumnsChanged() {
+      var handler = ColumnsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler RowsChanged;
+    protected virtual void OnRowsChanged() {
+      var handler = RowsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler ColumnNamesChanged;
     protected virtual void OnColumnNamesChanged() {
Index: /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 5149)
+++ /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 5150)
@@ -38,4 +38,6 @@
     bool SetValue(string value, int rowIndex, int columnIndex);
 
+    event EventHandler ColumnsChanged;
+    event EventHandler RowsChanged;
     event EventHandler ColumnNamesChanged;
     event EventHandler RowNamesChanged;
@@ -43,4 +45,5 @@
     event EventHandler<EventArgs<int, int>> ItemChanged;
     event EventHandler Reset;
+
   }
 }
Index: /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 5149)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 5150)
@@ -53,4 +53,5 @@
         else
           columnNames = new List<string>(value);
+        OnColumnNamesChanged();
       }
     }
@@ -67,4 +68,5 @@
         else
           rowNames = new List<string>(value);
+        OnRowNamesChanged();
       }
     }
@@ -94,4 +96,6 @@
           while (rowNames.Count < value)
             rowNames.Add("Row " + rowNames.Count);
+          OnRowsChanged();
+          OnRowNamesChanged();
           OnReset();
         }
@@ -111,4 +115,6 @@
           while (columnNames.Count < value)
             columnNames.Add("Column " + columnNames.Count);
+          OnColumnsChanged();
+          OnColumnNamesChanged();
           OnReset();
         }
@@ -167,5 +173,5 @@
     }
     protected StringMatrix(int rows, int columns, IEnumerable<string> columnNames, IEnumerable<string> rowNames)
-      : this(rows, columns,columnNames) {
+      : this(rows, columns, columnNames) {
       RowNames = rowNames;
     }
@@ -186,6 +192,6 @@
       ColumnNames = columnNames;
     }
-    protected StringMatrix(string[,] elements, IEnumerable<string> columnNames,IEnumerable<string> rowNames)
-      : this(elements,columnNames) {
+    protected StringMatrix(string[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames)
+      : this(elements, columnNames) {
       RowNames = rowNames;
     }
@@ -245,4 +251,17 @@
     }
 
+    #region events
+    public event EventHandler ColumnsChanged;
+    protected virtual void OnColumnsChanged() {
+      EventHandler handler = ColumnsChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    public event EventHandler RowsChanged;
+    protected virtual void OnRowsChanged() {
+      EventHandler handler = RowsChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
     public event EventHandler ColumnNamesChanged;
     protected virtual void OnColumnNamesChanged() {
@@ -275,4 +294,5 @@
       OnToStringChanged();
     }
+    #endregion
 
     #region IStringConvertibleMatrix Members
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 5149)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 5150)
@@ -53,4 +53,5 @@
         else
           columnNames = new List<string>(value);
+        OnColumnNamesChanged();
       }
     }
@@ -67,4 +68,5 @@
         else
           rowNames = new List<string>(value);
+        OnRowNamesChanged();
       }
     }
@@ -94,4 +96,6 @@
           while (rowNames.Count < value)
             rowNames.Add("Row " + rowNames.Count);
+          OnRowsChanged();
+          OnRowNamesChanged();
           OnReset();
         }
@@ -111,4 +115,6 @@
           while (columnNames.Count < value)
             columnNames.Add("Column " + columnNames.Count);
+          OnColumnsChanged();
+          OnColumnNamesChanged();
           OnReset();
         }
@@ -177,5 +183,5 @@
     }
     protected ValueTypeMatrix(T[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames)
-      : this(elements,columnNames) {
+      : this(elements, columnNames) {
       RowNames = rowNames;
     }
@@ -210,9 +216,22 @@
     }
 
+    #region events
+    public event EventHandler ColumnsChanged;
+    protected virtual void OnColumnsChanged() {
+      EventHandler handler = ColumnsChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    public event EventHandler RowsChanged;
+    protected virtual void OnRowsChanged() {
+      EventHandler handler = RowsChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
     public event EventHandler ColumnNamesChanged;
     protected virtual void OnColumnNamesChanged() {
       EventHandler handler = ColumnNamesChanged;
-      if(handler!=null)
-        handler(this,EventArgs.Empty);
+      if (handler != null)
+        handler(this, EventArgs.Empty);
     }
     public event EventHandler RowNamesChanged;
@@ -240,4 +259,5 @@
       OnToStringChanged();
     }
+    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 5149)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 5150)
@@ -123,7 +123,9 @@
       }
       columnNameCache = null;
+      OnColumnsChanged();
       OnColumnNamesChanged();
       rowNamesCache = null;
       base.OnCollectionReset(items, oldItems);
+      OnRowsChanged();
       OnRowNamesChanged();
       OnReset();
@@ -131,33 +133,40 @@
     }
     protected override void OnItemsAdded(IEnumerable<IRun> items) {
-      bool columnNamesChanged = false;
+      bool columnsChanged = false;
       foreach (IRun run in items) {
         foreach (KeyValuePair<string, IItem> parameter in run.Parameters)
-          columnNamesChanged |= AddParameter(parameter.Key, parameter.Value);
+          columnsChanged |= AddParameter(parameter.Key, parameter.Value);
         foreach (KeyValuePair<string, IItem> result in run.Results)
-          columnNamesChanged |= AddResult(result.Key, result.Value);
-      }
-      if (columnNamesChanged) columnNameCache = null;
+          columnsChanged |= AddResult(result.Key, result.Value);
+      }
+      if (columnsChanged) columnNameCache = null;
       rowNamesCache = null;
       base.OnItemsAdded(items);
       OnReset();
+      OnRowsChanged();
       OnRowNamesChanged();
-      if (columnNamesChanged) OnColumnNamesChanged();
+      if (columnsChanged) {
+        OnColumnsChanged();
+        OnColumnNamesChanged();
+      }
       UpdateFiltering(false);
     }
     protected override void OnItemsRemoved(IEnumerable<IRun> items) {
-      bool columnNamesChanged = false;
+      bool columnsChanged = false;
       foreach (IRun run in items) {
         foreach (string parameterName in run.Parameters.Keys)
-          columnNamesChanged |= RemoveParameterName(parameterName);
+          columnsChanged |= RemoveParameterName(parameterName);
         foreach (string resultName in run.Results.Keys)
-          columnNamesChanged |= RemoveResultName(resultName);
-      }
-      if (columnNamesChanged) columnNameCache = null;
+          columnsChanged |= RemoveResultName(resultName);
+      }
+      if (columnsChanged) columnNameCache = null;
       rowNamesCache = null;
       base.OnItemsRemoved(items);
       OnReset();
       OnRowNamesChanged();
-      if (columnNamesChanged) OnColumnNamesChanged();
+      if (columnsChanged) {
+        OnColumnsChanged();
+        OnColumnNamesChanged();
+      }
     }
 
@@ -287,4 +296,14 @@
       OnToStringChanged();
     }
+    public event EventHandler ColumnsChanged;
+    protected virtual void OnColumnsChanged() {
+      var handler = ColumnsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler RowsChanged;
+    protected virtual void OnRowsChanged() {
+      var handler = RowsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler ColumnNamesChanged;
     protected virtual void OnColumnNamesChanged() {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 5149)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 5150)
@@ -187,4 +187,14 @@
     }
 
+    public event EventHandler ColumnsChanged;
+    private void OnColumnsChanged() {
+      var handler = ColumnsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler RowsChanged;
+    private void OnRowsChanged() {
+      var handler = RowsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler ColumnNamesChanged;
     private void OnColumnNamesChanged() {
