Benutzer mit den meisten Antworten
SqlDataAdapter und FillSchema

Frage
-
Hallo Forum,
habe eine Tabelle in einer MS SQL DB.
Die Daten lade ich mit dem SqlDataAdapter "UmdataPos" .
Danach möchte ich die Daten in einem GridView darstellen. Dabei möchte ich verhindern das mehr Zeichen als erlaubt eingegeben werden können.
Dazu habe ich folgendes versucht.
System.Data.DataTable UmDataPosTabel = new System.Data.DataTable(); UmDataPos.FillSchema(UmDataPosTabel,SchemaType.Source); UmDataPos.Fill(UmDataPosTabel); TransverTabelledataGridView.DataSource = new BindingSource(UmDataPosTabel, "");
Beim verlassen der Zeile im GridView kommt jetzt eine Fehlermeldung das zu viele Zeichen vorhanden sind.
Gibt es eine Möglichkeit die Eingabe "direkt" zu begrenzen. Das GridView Feld sollte schon bei der Eingabe einfach keine weiteren Zeichen annehmen.
Gruß Roland- Bearbeitet Robert Breitenhofer Donnerstag, 28. Oktober 2010 08:19 Formatierung
Antworten
-
Hallo Roland,
Du kannst die Länge über die MaxInputLength Eigenschaft festlegen.
Das geschieht allerdings nicht automatisch, denn dort verlässt sich das DataGridView
auf die Überprüfung durch die gebundene DataTable, die bei Textspalten beim Überschreiten von MaxLength
eine Ausnahme auslöst. (Und die sollte man wie alle möglichen Fehler im DataGridViewError Ereignis behandeln).Willst Du MaxInputLength anhand von MaxLength setzen könnte das wie folgt aussehen:
private void CustomerGridForm_Load(object sender, EventArgs e) { DataTable customersTable = new DataTable("Customers"); using (var connection = new SqlConnection(Properties.Settings.Default.NorthwindConnectionString)) { using (var adapter = new SqlDataAdapter("SELECT * FROM dbo.Customers", connection)) { adapter.MissingMappingAction = MissingMappingAction.Passthrough; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; adapter.FillSchema(customersTable, SchemaType.Mapped); // Hier: Automatische Erzeugung this.dataGridView1.AutoGenerateColumns = true; this.dataGridView1.DataSource = new BindingSource(customersTable, ""); // Durchlaufen allerzugewiesenen Spalten foreach(var gridColumn in this.dataGridView1.Columns) { var textColumn = gridColumn as DataGridViewTextBoxColumn; if (textColumn != null && !String.IsNullOrEmpty(textColumn.DataPropertyName)) { // max. Eingabe-Länge über MaxLength Eigenschaft der DataColumn zuweisen. var dataColumn = customersTable.Columns[textColumn.DataPropertyName]; if (dataColumn.MaxLength > 0) { textColumn.MaxInputLength = dataColumn.MaxLength; } } } // Was zum gucken... adapter.Fill(customersTable); } } }
Der Code verwendet die Northwind.Customers wo reichlich (nur) Textspalten vorkommen.
Gruß Elmar
- Als Antwort markiert Robert Breitenhofer Donnerstag, 28. Oktober 2010 08:19
Alle Antworten
-
Hallo Roland,
Du kannst die Länge über die MaxInputLength Eigenschaft festlegen.
Das geschieht allerdings nicht automatisch, denn dort verlässt sich das DataGridView
auf die Überprüfung durch die gebundene DataTable, die bei Textspalten beim Überschreiten von MaxLength
eine Ausnahme auslöst. (Und die sollte man wie alle möglichen Fehler im DataGridViewError Ereignis behandeln).Willst Du MaxInputLength anhand von MaxLength setzen könnte das wie folgt aussehen:
private void CustomerGridForm_Load(object sender, EventArgs e) { DataTable customersTable = new DataTable("Customers"); using (var connection = new SqlConnection(Properties.Settings.Default.NorthwindConnectionString)) { using (var adapter = new SqlDataAdapter("SELECT * FROM dbo.Customers", connection)) { adapter.MissingMappingAction = MissingMappingAction.Passthrough; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; adapter.FillSchema(customersTable, SchemaType.Mapped); // Hier: Automatische Erzeugung this.dataGridView1.AutoGenerateColumns = true; this.dataGridView1.DataSource = new BindingSource(customersTable, ""); // Durchlaufen allerzugewiesenen Spalten foreach(var gridColumn in this.dataGridView1.Columns) { var textColumn = gridColumn as DataGridViewTextBoxColumn; if (textColumn != null && !String.IsNullOrEmpty(textColumn.DataPropertyName)) { // max. Eingabe-Länge über MaxLength Eigenschaft der DataColumn zuweisen. var dataColumn = customersTable.Columns[textColumn.DataPropertyName]; if (dataColumn.MaxLength > 0) { textColumn.MaxInputLength = dataColumn.MaxLength; } } } // Was zum gucken... adapter.Fill(customersTable); } } }
Der Code verwendet die Northwind.Customers wo reichlich (nur) Textspalten vorkommen.
Gruß Elmar
- Als Antwort markiert Robert Breitenhofer Donnerstag, 28. Oktober 2010 08:19