Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs	(revision 3446)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs	(revision 3447)
@@ -33,4 +33,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 
 namespace HeuristicLab.Optimization.Views {
@@ -82,4 +83,8 @@
     }
 
+    public IStringConvertibleMatrix Matrix {
+      get { return this.Content; }
+    }
+
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
@@ -146,8 +151,8 @@
       this.yAxisComboBox.Items.Clear();
       this.sizeComboBox.Items.Clear();
-      this.xAxisComboBox.Items.AddRange(Content.ColumnNames.ToArray());
-      this.yAxisComboBox.Items.AddRange(Content.ColumnNames.ToArray());
+      this.xAxisComboBox.Items.AddRange(Matrix.ColumnNames.ToArray());
+      this.yAxisComboBox.Items.AddRange(Matrix.ColumnNames.ToArray());
       this.sizeComboBox.Items.Add(constantLabel);
-      this.sizeComboBox.Items.AddRange(Content.ColumnNames.ToArray());
+      this.sizeComboBox.Items.AddRange(Matrix.ColumnNames.ToArray());
     }
 
@@ -194,11 +199,16 @@
         return null;
 
-      string value = Content.GetValue(row, column);
-      double d;
-      double? ret = null;
-      if (double.TryParse(value, out d))
-        ret = d;
-      else if (value != null)
-        ret = GetCategoricalValue(column, value);
+      IItem value = Content.GetValue(row, column);
+      DoubleValue doubleValue = value as DoubleValue;
+      IntValue intValue = value as IntValue;
+      double ret;
+
+      if (doubleValue != null)
+        ret = doubleValue.Value;
+      else if (intValue != null)
+        ret = intValue.Value;
+      else
+        ret = GetCategoricalValue(column, Matrix.GetValue(row, column));
+
       return ret;
     }
@@ -361,8 +371,8 @@
       builder.AppendLine(this.Content.ElementAt(runIndex).Name);
       int columnIndex = 0;
-      foreach (string columnName in this.Content.ColumnNames) {
+      foreach (string columnName in Matrix.ColumnNames) {
         builder.Append(columnName);
         builder.Append(": ");
-        builder.AppendLine(this.Content.GetValue(runIndex, columnIndex));
+        builder.AppendLine(Matrix.GetValue(runIndex, columnIndex));
         columnIndex++;
       }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.cs	(revision 3446)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionTabularView.cs	(revision 3447)
@@ -31,4 +31,5 @@
 using HeuristicLab.Data.Views;
 using HeuristicLab.Collections;
+using HeuristicLab.Core;
 
 namespace HeuristicLab.Optimization.Views {
@@ -68,4 +69,62 @@
       }
     }
+
+
+    protected override int[] Sort(IEnumerable<KeyValuePair<int, SortOrder>> sortedColumns) {
+      int[] newSortedIndex = Enumerable.Range(0, Content.Count).ToArray();
+      RunCollectionRowComparer rowComparer = new RunCollectionRowComparer();
+      if (sortedColumns.Count() != 0) {
+        rowComparer.SortedIndizes = sortedColumns;
+        rowComparer.Matrix = Content;
+        Array.Sort(newSortedIndex, rowComparer);
+      }
+      return newSortedIndex;
+    }
+
+    public class RunCollectionRowComparer : IComparer<int> {
+      public RunCollectionRowComparer() {
+      }
+
+      private List<KeyValuePair<int, SortOrder>> sortedIndizes;
+      public IEnumerable<KeyValuePair<int, SortOrder>> SortedIndizes {
+        get { return this.sortedIndizes; }
+        set { sortedIndizes = new List<KeyValuePair<int, SortOrder>>(value); }
+      }
+      private RunCollection matrix;
+      public RunCollection Matrix {
+        get { return this.matrix; }
+        set { this.matrix = value; }
+      }
+
+      public int Compare(int x, int y) {
+        int result = 0;
+        IItem value1, value2;
+        IComparable comparable1, comparable2;
+
+        if (matrix == null)
+          throw new InvalidOperationException("Could not sort IStringConvertibleMatrix if the matrix member is null.");
+        if (sortedIndizes == null)
+          return 0;
+
+        foreach (KeyValuePair<int, SortOrder> pair in sortedIndizes.Where(p => p.Value != SortOrder.None)) {
+          value1 = matrix.GetValue(x, pair.Key);
+          value2 = matrix.GetValue(y, pair.Key);
+          comparable1 = value1 as IComparable;
+          comparable2 = value2 as IComparable;
+          if (comparable1 != null)
+            result = comparable1.CompareTo(comparable2);
+          else {
+            string string1 = value1 != null ? value1.ToString() : string.Empty;
+            string string2 = value2 != null ? value2.ToString() : string.Empty;
+            result = string1.CompareTo(string2);
+          }
+          if (pair.Value == SortOrder.Descending)
+            result *= -1;
+          if (result != 0)
+            return result;
+        }
+        return result;
+      }
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3446)
+++ trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3447)
@@ -35,4 +35,8 @@
     public RunCollection(int capacity) : base(capacity) { Initialize(); }
     public RunCollection(IEnumerable<IRun> collection) : base(collection) { Initialize(); this.OnItemsAdded(collection); }
+    private void Initialize() {
+      parameterNames = new List<string>();
+      resultNames = new List<string>();
+    }
 
     protected static Type[] viewableDataTypes = new Type[]{typeof(BoolValue), typeof(DoubleValue), typeof(IntValue),
@@ -82,8 +86,5 @@
     }
 
-    private void Initialize() {
-      parameterNames = new List<string>();
-      resultNames = new List<string>();
-    }
+
 
     private bool AddParameter(string name, IItem value) {
@@ -122,4 +123,20 @@
     }
 
+    public IItem GetValue(int rowIndex, int columnIndex) {
+      IRun run = this.list[rowIndex];
+      IItem value = null;
+
+      if (columnIndex < parameterNames.Count) {
+        string parameterName = parameterNames[columnIndex];
+        if (run.Parameters.ContainsKey(parameterName))
+          value = run.Parameters[parameterName];
+      } else if (columnIndex < parameterNames.Count + resultNames.Count) {
+        string resultName = resultNames[columnIndex - parameterNames.Count];
+        if (run.Results.ContainsKey(resultName))
+          value = run.Results[resultName];
+      }
+      return value;
+    }
+
     #region IStringConvertibleMatrix Members
     [Storable]
@@ -127,13 +144,13 @@
     [Storable]
     private List<string> resultNames;
-    public int Rows {
+    int IStringConvertibleMatrix.Rows {
       get { return this.Count; }
-      set { throw new System.NotImplementedException(); }
-    }
-    public int Columns {
+      set { throw new NotSupportedException(); }
+    }
+    int IStringConvertibleMatrix.Columns {
       get { return parameterNames.Count + resultNames.Count; }
       set { throw new NotSupportedException(); }
     }
-    public IEnumerable<string> ColumnNames {
+    IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
       get {
         List<string> value = new List<string>(parameterNames);
@@ -143,34 +160,21 @@
       set { throw new NotSupportedException(); }
     }
-    public IEnumerable<string> RowNames {
+    IEnumerable<string> IStringConvertibleMatrix.RowNames {
       get { return list.Select(x => x.Name).ToList(); }
       set { throw new NotSupportedException(); }
     }
-    public bool SortableView {
+    bool IStringConvertibleMatrix.SortableView {
       get { return true; }
       set { throw new NotSupportedException(); }
     }
-    public bool ReadOnly {
-      get { return false; }
-    }
-
-    public string GetValue(int rowIndex, int columnIndex) {
-      IRun run = this.list[rowIndex];
-      string value = string.Empty;
-
-      if (columnIndex < parameterNames.Count) {
-        string parameterName = parameterNames[columnIndex];
-        if (run.Parameters.ContainsKey(parameterName)) {
-          IItem param = run.Parameters[parameterName];
-          if (param != null) value = param.ToString();
-        }
-      } else if (columnIndex < parameterNames.Count + resultNames.Count) {
-        string resultName = resultNames[columnIndex - parameterNames.Count];
-        if (run.Results.ContainsKey(resultName)) {
-          IItem result = run.Results[resultName];
-          if (result != null) value = result.ToString();
-        }
-      }
-      return value;
+    bool IStringConvertibleMatrix.ReadOnly {
+      get { return true; }
+    }
+
+    string IStringConvertibleMatrix.GetValue(int rowIndex, int columnIndex) {
+      IItem value = GetValue(rowIndex, columnIndex);
+      if (value == null)
+        return string.Empty;
+      return value.ToString();
     }
 
