none
SqlDataAdapter und FillSchema RRS feed

  • 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
    Freitag, 8. Oktober 2010 12:14

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

    Sonntag, 10. Oktober 2010 16:27

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

    Sonntag, 10. Oktober 2010 16:27
  • Hallo Elmar,

    Danke. Das war der Hinweis zu Lösung.

    Gruß Roland


    Gruß Roland
    Dienstag, 12. Oktober 2010 08:23