Index: branches/HivePerformance/sources/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- branches/HivePerformance/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 9368)
+++ branches/HivePerformance/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 9444)
@@ -34,4 +34,6 @@
   [StorableClass]
   public class StringArray : Item, IEnumerable<string>, IStringConvertibleArray {
+    private const int maximumToStringLength = 100;
+
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
@@ -106,10 +108,15 @@
 
     public override string ToString() {
+      if (array.Length == 0) return "[]";
+
       StringBuilder sb = new StringBuilder();
       sb.Append("[");
-      if (array.Length > 0) {
-        sb.Append(array[0]);
-        for (int i = 1; i < array.Length; i++)
-          sb.Append(";").Append(array[i]);
+      sb.Append(array[0]);
+      for (int i = 1; i < array.Length; i++) {
+        sb.Append(";").Append(array[i]);
+        if (sb.Length > maximumToStringLength) {
+          sb.Append("...");
+          break;
+        }
       }
       sb.Append("]");
@@ -150,5 +157,6 @@
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int>(index));
-      OnToStringChanged();
+      if (index < maximumToStringLength)
+        OnToStringChanged();
     }
     public event EventHandler Reset;
Index: branches/HivePerformance/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- branches/HivePerformance/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 9368)
+++ branches/HivePerformance/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 9444)
@@ -34,4 +34,6 @@
   [StorableClass]
   public class StringMatrix : Item, IEnumerable<string>, IStringConvertibleMatrix {
+    private const int maximumToStringLength = 100;
+
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
@@ -208,15 +210,21 @@
 
     public override string ToString() {
+      if (matrix.Length == 0) return "[]";
+
       StringBuilder sb = new StringBuilder();
       sb.Append("[");
-      if (matrix.Length > 0) {
-        for (int i = 0; i < Rows; i++) {
-          sb.Append("[").Append(matrix[i, 0]);
-          for (int j = 1; j < Columns; j++)
-            sb.Append(";").Append(matrix[i, j]);
-          sb.Append("]");
+      for (int i = 0; i < Rows; i++) {
+        sb.Append("[").Append(matrix[i, 0]);
+        for (int j = 1; j < Columns; j++)
+          sb.Append(";").Append(matrix[i, j]);
+        sb.Append("]");
+
+        if (sb.Length > maximumToStringLength) {
+          sb.Append("[...]");
+          break;
         }
       }
       sb.Append("]");
+
       return sb.ToString();
     }
@@ -286,5 +294,9 @@
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
-      OnToStringChanged();
+
+      //approximation to avoid firing of unnecessary ToStringChangedEvents
+      //columnIndex is not used, because always full rows are returned in the ToString method
+      if (rowIndex * Columns < maximumToStringLength)
+        OnToStringChanged();
     }
     public event EventHandler Reset;
Index: branches/HivePerformance/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs
===================================================================
--- branches/HivePerformance/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 9368)
+++ branches/HivePerformance/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 9444)
@@ -34,4 +34,6 @@
   [StorableClass]
   public abstract class ValueTypeArray<T> : Item, IEnumerable<T> where T : struct {
+    private const int maximumToStringLength = 100;
+
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
@@ -99,10 +101,15 @@
 
     public override string ToString() {
+      if (array.Length == 0) return "[]";
+
       StringBuilder sb = new StringBuilder();
       sb.Append("[");
-      if (array.Length > 0) {
-        sb.Append(array[0].ToString());
-        for (int i = 1; i < array.Length; i++)
-          sb.Append(";").Append(array[i].ToString());
+      sb.Append(array[0].ToString());
+      for (int i = 1; i < array.Length; i++) {
+        sb.Append(";").Append(array[i].ToString());
+        if (sb.Length > maximumToStringLength) {
+          sb.Append("...");
+          break;
+        }
       }
       sb.Append("]");
@@ -122,5 +129,6 @@
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int>(index));
-      OnToStringChanged();
+      if (index < maximumToStringLength)
+        OnToStringChanged();
     }
     public event EventHandler Reset;
Index: branches/HivePerformance/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- branches/HivePerformance/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 9368)
+++ branches/HivePerformance/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 9444)
@@ -34,4 +34,6 @@
   [StorableClass]
   public abstract class ValueTypeMatrix<T> : Item, IEnumerable<T> where T : struct {
+    private const int maximumToStringLength = 100;
+
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
@@ -194,15 +196,21 @@
 
     public override string ToString() {
+      if (matrix.Length == 0) return "[]";
+
       StringBuilder sb = new StringBuilder();
       sb.Append("[");
-      if (matrix.Length > 0) {
-        for (int i = 0; i < Rows; i++) {
-          sb.Append("[").Append(matrix[i, 0].ToString());
-          for (int j = 1; j < Columns; j++)
-            sb.Append(";").Append(matrix[i, j].ToString());
-          sb.Append("]");
+      for (int i = 0; i < Rows; i++) {
+        sb.Append("[").Append(matrix[i, 0].ToString());
+        for (int j = 1; j < Columns; j++)
+          sb.Append(";").Append(matrix[i, j].ToString());
+        sb.Append("]");
+
+        if (sb.Length > maximumToStringLength) {
+          sb.Append("[...]");
+          break;
         }
       }
       sb.Append("]");
+
       return sb.ToString();
     }
@@ -251,5 +259,9 @@
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
-      OnToStringChanged();
+
+      //approximation to avoid firing of unnecessary ToStringChangedEvents
+      //columnIndex is not used, because always full rows are returned in the ToString method
+      if (rowIndex * Columns < maximumToStringLength)
+        OnToStringChanged();
     }
     public event EventHandler Reset;
