Ich habe ein Problem bei einer DataTable, die ich mit Werten befüllen möchte. Eine Spalte ist als Unique eingerichtet, um doppelte Werte zu vermeiden. Wenn ich nun zwei Werte haben, die einmal mit 'ß' und einmal mit 'ss' geschrieben werden und diese in die Tabelle schreiben möchte, dann bekomme ich eine ConstraintExeption mit dem Hinweis, der Wert sei schon vorhanden (wie im Beispiel: "Column 'key' is constrained to be unique. Value 'Weiss' is already present.").
Gleiches Problem habe ich mit der Groß-/Kleinschreibung. Unterscheidet sich bei einem Wort lediglich die Groß-Kleinschreibung, dann ist das für ihn offenbar auch der gleiche Wert.
Wie kann ich dieses Verhalten ändern?
using System.Data; using System.Windows.Forms;
namespace UniqueKeyDataTable { public class Form2 : Form { private DataTable dataTable = new DataTable(); private DataGridView dataGridView;
public Form2() { dataGridView = new DataGridView(); dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; dataGridView.Dock = DockStyle.Fill; dataGridView.Name = "dataGridView";
//Werte zur Tabelle hinzufügen AddNewValue("Weiß"); AddNewValue("Weiss");
AddNewValue("SCHWARZ"); AddNewValue("schwarz"); }
private void AddNewValue(string value) { DataRow row = dataTable.NewRow(); row[0] = value.GetHashCode(); row[1] = value; //Falls du trotzdem den Key-Wert anzeigen möchtest //beim zweiten Versuch krachts hier mit einer ConstraintException dataTable.Rows.Add(row); } }
Sinngemäßt etwa so. Ich hab die Änderungen mal unterlegt. GetHashCode erzeugt eine eindeutige ID für jeden String wobei "Weiß"<>"Weiss"<>"weiß"<>"weiss" ist. Natürlich kannst du das Case-Sensitiv auch "deaktivieren" in dem du value.ToUpper().GetHashCode(); schreibst.
Das funktioniert praktisch tatsächlich und scheint mir vorerst der einzig brauchbare Weg zu sein. Wirklich schön ist das aber eigentlich nicht. Ich speichere zusätzliche Informationen, die ich eigentlich gar nicht benötigen würde, nur weil das, was ich eigentlich möchte, nicht vernünftig unterstützt wird.
@Floyd: Nee, seine Überschrift ist nur falsch bis missverständlich. Das Default-Verhalten von DataTable ist case insensitive und culture correct. Und er möchte genau das Gegenteil.
Die Property CaseSensitive hatte ich eigentlich schon ausprobiert und dachte die würde nicht helfen. Tatsächlich beseitigt sie wenigstens das "SCHWARZ/schwarz" Problem. Nichts desto trotz ist das Problem mit "Weiß/Weiss" damit nicht gelöst ...
Ich hab das mal probiert wie von Dir vorgeschlagen. Leider fliegt mir dann bei der Anzeige der Tabelle das Ding um die Ohren: [quote]System.ArgumentExeption: Parameter is not valid.[/quote]
Wirklich schön ist das aber eigentlich nicht. Ich speichere zusätzliche Informationen, die ich eigentlich gar nicht benötigen würde, nur weil das, was ich eigentlich möchte, nicht vernünftig unterstützt wird.
Dennoch danke für den Tipp!