Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.Designer.cs	(revision 4199)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.Designer.cs	(revision 4200)
@@ -46,4 +46,5 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
+      this.dataGridView.RowHeaderMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(dataGridView_RowHeaderMouseDoubleClick);
     }
 
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.cs	(revision 4199)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.cs	(revision 4200)
@@ -31,8 +31,8 @@
   [View("RunCollection Tabular View")]
   [Content(typeof(RunCollection), false)]
-  public partial class RunCollectionTabularView : StringConvertibleMatrixView {
+  public sealed partial class RunCollectionTabularView : StringConvertibleMatrixView {
+    private int[] runToRowMapping;
     public RunCollectionTabularView() {
       InitializeComponent();
-      this.dataGridView.RowHeaderMouseDoubleClick += new DataGridViewCellMouseEventHandler(dataGridView_RowHeaderMouseDoubleClick);
       base.ReadOnly = true;
     }
@@ -51,9 +51,10 @@
       base.OnContentChanged();
       if (Content != null) {
-        foreach (IRun run in Content)
-          UpdateRun(run);
-      }
-    }
-
+        runToRowMapping = Enumerable.Range(0, Content.Count).ToArray();
+        UpdateRowAttributes();
+      }
+    }
+
+    #region events
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
@@ -63,5 +64,5 @@
       RegisterRunEvents(Content);
     }
-    protected virtual void RegisterRunEvents(IEnumerable<IRun> runs) {
+    private void RegisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
         run.Changed += new EventHandler(run_Changed);
@@ -74,5 +75,5 @@
       DeregisterRunEvents(Content);
     }
-    protected virtual void DeregisterRunEvents(IEnumerable<IRun> runs) {
+    private void DeregisterRunEvents(IEnumerable<IRun> runs) {
       foreach (IRun run in runs)
         run.Changed -= new EventHandler(run_Changed);
@@ -81,4 +82,5 @@
       DeregisterRunEvents(e.OldItems);
       RegisterRunEvents(e.Items);
+      OnContentChanged();
     }
     private void Content_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IRun> e) {
@@ -96,16 +98,27 @@
       }
     }
+    #endregion
 
     private void UpdateRun(IRun run) {
-      int rowIndex = Content.ToList().IndexOf(run);
-      rowIndex = virtualRowIndizes[rowIndex];
+      int runIndex = GetIndexOfRun(run);
+      int rowIndex = runToRowMapping[runIndex];
       this.dataGridView.Rows[rowIndex].Visible = run.Visible;
       this.dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor = run.Color;
-      this.rowsTextBox.Text = this.Content.Count(r => r.Visible).ToString();
+      this.UpdateRowHeaders();
+    }
+
+    private int GetIndexOfRun(IRun run) {
+      int i = 0;
+      foreach (IRun actualRun in Content) {
+        if (actualRun == run)
+          return i;
+        i++;
+      }
+      throw new ArgumentException("Run " + run.Name + "could not be found in the RunCollection.");
     }
 
     private void dataGridView_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {
       if (e.RowIndex >= 0) {
-        IRun run = Content.ElementAt(virtualRowIndizes[e.RowIndex]);
+        IRun run = Content.ElementAt(runToRowMapping.ToList().IndexOf(e.RowIndex));
         IContentView view = MainFormManager.MainForm.ShowContent(run);
         if (view != null) {
@@ -124,5 +137,23 @@
         Array.Sort(newSortedIndex, rowComparer);
       }
+
+      runToRowMapping = new int[newSortedIndex.Length];
+      int i = 0;
+      foreach (int runIndex in newSortedIndex) {
+        runToRowMapping[runIndex] = i;
+        i++;
+      }
+      UpdateRowAttributes();
       return newSortedIndex;
+    }
+
+    private void UpdateRowAttributes() {
+      int runIndex = 0;
+      foreach (IRun run in Content) {
+        int rowIndex = this.runToRowMapping[runIndex];
+        this.dataGridView.Rows[rowIndex].Visible = run.Visible;
+        this.dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor = run.Color;
+        runIndex++;
+      }
     }
 
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 4199)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionView.cs	(revision 4200)
@@ -111,8 +111,8 @@
           ListViewItem listViewItem = CreateListViewItem(item);
           AddListViewItem(listViewItem);
-          UpdateRun(item);
           if ((selectedName != null) && item.Name.Equals(selectedName))
             listViewItem.Selected = true;
         }
+        AdjustListViewColumnSizes();
       } else {
         runCollectionConstraintCollectionView.Content = null;
@@ -150,4 +150,12 @@
       listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
       listViewItem.Tag = item;
+
+      if (item.Visible) {
+        listViewItem.Font = new Font(listViewItem.Font, FontStyle.Regular);
+        listViewItem.ForeColor = item.Color;
+      } else {
+        listViewItem.Font = new Font(listViewItem.Font, FontStyle.Italic);
+        listViewItem.ForeColor = Color.LightGray;
+      }
       return listViewItem;
     }
@@ -156,5 +164,4 @@
       ((IRun)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
       ((IRun)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
-      AdjustListViewColumnSizes();
     }
     protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
@@ -294,8 +301,8 @@
       else {
         RegisterRunEvents(e.Items);
-        foreach (IRun item in e.Items) {
+        foreach (IRun item in e.Items)
           AddListViewItem(CreateListViewItem(item));
-          UpdateRun(item);
-        }
+
+        AdjustListViewColumnSizes();
         analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
         clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
@@ -331,8 +338,8 @@
         }
         RegisterRunEvents(e.Items);
-        foreach (IRun item in e.Items) {
+        foreach (IRun item in e.Items)
           AddListViewItem(CreateListViewItem(item));
-          UpdateRun(item);
-        }
+
+        AdjustListViewColumnSizes();
         analyzeRunsToolStripDropDownButton.Enabled = itemsListView.Items.Count > 0;
         clearButton.Enabled = itemsListView.Items.Count > 0 && !Content.IsReadOnly && !ReadOnly;
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 4199)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Run.cs	(revision 4200)
@@ -34,4 +34,53 @@
   [StorableClass]
   public sealed class Run : NamedItem, IRun {
+    [StorableConstructor]
+    private Run(bool deserializing) : base(deserializing) { }
+    public Run()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+      color = Color.Black;
+      algorithm = null;
+      parameters = new Dictionary<string, IItem>();
+      results = new Dictionary<string, IItem>();
+    }
+    public Run(IAlgorithm algorithm)
+      : base() {
+      if (algorithm == null) throw new ArgumentNullException();
+      name = algorithm.Name + " Run (" + algorithm.ExecutionTime.ToString() + ")";
+      description = ItemDescription;
+      color = Color.Black;
+      Initialize(algorithm);
+    }
+    public Run(string name, IAlgorithm algorithm)
+      : base(name) {
+      if (algorithm == null) throw new ArgumentNullException();
+      color = Color.Black;
+      description = ItemDescription;
+      Initialize(algorithm);
+    }
+    public Run(string name, string description, IAlgorithm algorithm)
+      : base(name, description) {
+      if (algorithm == null) throw new ArgumentNullException();
+      color = Color.Black;
+      Initialize(algorithm);
+    }
+
+    private void Initialize(IAlgorithm algorithm) {
+      IAlgorithm clone = (IAlgorithm)algorithm.Clone();
+      parameters = new Dictionary<string, IItem>();
+      results = new Dictionary<string, IItem>();
+      clone.CollectParameterValues(parameters);
+      clone.CollectResultValues(results);
+      if (clone.StoreAlgorithmInEachRun) {
+        clone.Prepare(true);
+        this.algorithm = clone;
+      }
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      if (color == Color.Empty) color = Color.Black;
+    }
+
     [Storable]
     private IAlgorithm algorithm;
@@ -78,54 +127,4 @@
     }
 
-    [StorableConstructor]
-    private Run(bool deserializing) : base(deserializing) { }
-    public Run()
-      : base() {
-      name = ItemName;
-      description = ItemDescription;
-      color = Color.Black;
-      algorithm = null;
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
-    }
-    public Run(IAlgorithm algorithm)
-      : base() {
-      if (algorithm == null) throw new ArgumentNullException();
-      name = algorithm.Name + " Run (" + algorithm.ExecutionTime.ToString() + ")";
-      description = ItemDescription;
-      color = Color.Black;
-      Initialize(algorithm);
-    }
-    public Run(string name, IAlgorithm algorithm)
-      : base(name) {
-      if (algorithm == null) throw new ArgumentNullException();
-      color = Color.Black;
-      description = ItemDescription;
-      Initialize(algorithm);
-    }
-    public Run(string name, string description, IAlgorithm algorithm)
-      : base(name, description) {
-      if (algorithm == null) throw new ArgumentNullException();
-      color = Color.Black;
-      Initialize(algorithm);
-    }
-
-    private void Initialize(IAlgorithm algorithm) {
-      IAlgorithm clone = (IAlgorithm)algorithm.Clone();
-      parameters = new Dictionary<string, IItem>();
-      results = new Dictionary<string, IItem>();
-      clone.CollectParameterValues(parameters);
-      clone.CollectResultValues(results);
-      if (clone.StoreAlgorithmInEachRun) {
-        clone.Prepare(true);
-        this.algorithm = clone;
-      }
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserializationHook() {
-      if (color == Color.Empty) color = Color.Black;
-    }
-
     public override IDeepCloneable Clone(Cloner cloner) {
       Run clone = (Run)base.Clone(cloner);
Index: /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 4199)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 4200)
@@ -72,5 +72,7 @@
       base.OnCollectionReset(items, oldItems);
       OnReset();
+      columnNameCache = null;
       OnColumnNamesChanged();
+      rowNamesCache = null;
       OnRowNamesChanged();
     }
@@ -85,6 +87,9 @@
       base.OnItemsAdded(items);
       OnReset();
-      if (columnNamesChanged)
+      if (columnNamesChanged) {
+        columnNameCache = null;
         OnColumnNamesChanged();
+      }
+      rowNamesCache = null;
       OnRowNamesChanged();
       this.UpdateFiltering(false);
@@ -100,6 +105,9 @@
       base.OnItemsRemoved(items);
       OnReset();
-      if (columnNamesChanged)
+      if (columnNamesChanged) {
+        columnNameCache = null;
         OnColumnNamesChanged();
+      }
+      rowNamesCache = null;
       OnRowNamesChanged();
     }
@@ -207,15 +215,23 @@
       set { throw new NotSupportedException(); }
     }
+    private List<string> columnNameCache;
     IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
       get {
-        List<string> value = new List<string>(parameterNames);
-        value.AddRange(resultNames);
-        value.Sort();
-        return value;
-      }
-      set { throw new NotSupportedException(); }
-    }
+        if (columnNameCache == null) {
+          columnNameCache = new List<string>(parameterNames);
+          columnNameCache.AddRange(resultNames);
+          columnNameCache.Sort();
+        }
+        return columnNameCache;
+      }
+      set { throw new NotSupportedException(); }
+    }
+    private List<string> rowNamesCache;
     IEnumerable<string> IStringConvertibleMatrix.RowNames {
-      get { return list.Select(x => x.Name).ToList(); }
+      get {
+        if (rowNamesCache == null)
+          rowNamesCache = list.Select(x => x.Name).ToList();
+        return rowNamesCache;
+      }
       set { throw new NotSupportedException(); }
     }
