none
DataGridView - CellValidating - Lösungsansätze - CurrentCell.FormattedValue RRS feed

  • Frage

  • Hallo,

    ich darf den Wert verkleinern, nicht vergrößern. Hab's so gelöst.

     private void dGVMaterial_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
      {
       if (dGVMaterial.Columns[e.ColumnIndex].Name == "quantity")
       {
        if (dGVMaterial.CurrentCell.RowIndex == 0 && dGVMaterial.CurrentCell.OwningColumn.Name == "quantity")
        {
         string isBe = dGVMaterial.CurrentCell.FormattedValue.ToString();
         string newValue = e.FormattedValue.ToString();
    
         Int32 intIsBe = 0;
         Int32 intNewValue = 0;
    
         try
         {
          intIsBe = Convert.ToInt32(isBe);
          intNewValue = Convert.ToInt32(newValue);
    
          if (intNewValue <= intIsBe)
           dGVMaterial.Rows[e.RowIndex].ErrorText = "";
          else
           throw (new FormatException("PUnklar ist
    
    
    


     Mal so mal so, gibt es irgendwo eine grafische!! Übersicht, was was ist ?!?

     if (dGVMaterial.Columns[e.ColumnIndex].Name == "quantity")
          {
            if (dGVMaterial.CurrentCell.RowIndex == 0 && dGVMaterial.CurrentCell.OwningColumn.Name == "quantity")
            {

    Spalte spreche ich so an?
     this.quantity.DataPropertyName = "Quantity";

     Zelle spreche ich so an?
     this.quantity.Name = "quantity";

     Eigentlich uninteressant ?   HeaderText; User mehr nicht, korrekt?

    Grüße Andreas

    Montag, 25. Juli 2011 15:27

Antworten

  • Hallo Andreas,

    • DataPropertyName, Name, HeaderText ... Wie spricht man nun was an?

    die (geeigntste) zu wählende Methode bzw. Eigenschaft unterscheidet sich, je nach Bindung der Daten an das DataGridView.

     

    Es kann sein, dass das Grid gar nicht über einen DataSource gebunden ist, dann scheidet bspw. DataPropertyName aus.
    Es kann auch sein, dass die Name-Eigenschaft leer ist. Zum Teil kann auch mal eine DisplayIndex-Eigenschaft zu wählen sein.

    Wichtig ist, dass man versucht, die Wahl der Eigenschaft so typsicher wie möglich zu machen. In Deinem Fall arbeitest Du bspw. mit Strings, wo man sich auch leicht mal verschreiben kann. Bei typsicheren DataSets/DataTables bspw. kann man den ColumnName über das Schema abfragen und arbeitet ohne manuell eingegebene Strings. Man kann sich auch eine Klasse bauen, die die Namen als statische öffentliche Konstanten-Strings hält. Der Vorteil ist (und sollte sein), dass bei Änderungen in Datenquellen-Klassen ggf. automatisch die erweiterten/geänderten Stellen schon durch den Compiler markiert werden und, dass man schneller und fehlerfreier die Namen (ggf. mit Intellisense) auswählen kann. Nun, trotzdem hat alles Vor- und Nachteile, die goldene (immer anwendbare) Lösung gibt es da nicht.
    Zur Technik der Validierung ggf. noch Bei Bedarf mit "e.Cancel = true" und der ErrorText-Eigenschaft arbeiten.

    [Exemplarische Vorgehensweise: Validieren von Daten im DataGridView-Steuerelement in Windows Forms]
    http://msdn.microsoft.com/de-de/library/ykdxa0bc.aspx

    Was auch zum Teil unbekannt ist, dass man in seinen Businessobjekten IDataErrorInfo  [->Beispiel, sonst oft nur aus WPF/Silverlight bekannt] implementieren kann, und dann den BindingSource als DataSource für einen eigenen ErrorProvider nutzen kann. Auf diesem Weg können die Businessobjekte selber die Validierung übernehmen und das Grid zeigt Validierungsfehler automatisch an. In Deinem Fall wolltest Du ja eine "größer/kleiner - Prüfung", die dann bspw. über das RangeAttribute geregelt werden könnte. 


    ciao Frank

    Mittwoch, 27. Juli 2011 05:31

Alle Antworten

  • Hallo Andreas,

    könntest Du die Frage etwas genauer stellen?

     


    ciao Frank
    Montag, 25. Juli 2011 19:05
  • könntest Du die Frage etwas genauer stellen?

    Hallo Frank,

    ja kein Problem.

    A)

    Bei einem DataGridView gilt es für eine Zelle eine Überprüfung zu machen.

        A1 Neuer Wert <= Alter Wert --> IO

        A2  Neuer Wert > Alter Wert --> NIO

       Am besten dann eine Meldungsausgabe.

       Ich habe es wie oben gelöst, bin jedoch nicht sicher, ob gut.

    B)

      Das DataGridView hat ja viele Eigenschaften, oft ist es ja, verbiegen kann man alles, wie ansprechen.

      Es liegen folgende Namen vor.

    • DataPropertyName
    • Name
    • HeaderText 

    Wie spricht man nun was an? Einfach ein Übersichtsbild. Man sucht halt relativ lange bis man ans Ziel kommt.

    Oder anders gesagt Unterschied DataPropertyName  zu Name...

    Am besten ist doch immer gezielt mit Name ansprechen, so ist man los gelöst vom Index.

    OK?

    Grüße Andreas

    Montag, 25. Juli 2011 20:03
  • Hallo Frank,

    noch Fragen, weißt Du was ich meine?

    Grüße Andreas

    Dienstag, 26. Juli 2011 19:20
  • Hallo Andreas,

    • DataPropertyName, Name, HeaderText ... Wie spricht man nun was an?

    die (geeigntste) zu wählende Methode bzw. Eigenschaft unterscheidet sich, je nach Bindung der Daten an das DataGridView.

     

    Es kann sein, dass das Grid gar nicht über einen DataSource gebunden ist, dann scheidet bspw. DataPropertyName aus.
    Es kann auch sein, dass die Name-Eigenschaft leer ist. Zum Teil kann auch mal eine DisplayIndex-Eigenschaft zu wählen sein.

    Wichtig ist, dass man versucht, die Wahl der Eigenschaft so typsicher wie möglich zu machen. In Deinem Fall arbeitest Du bspw. mit Strings, wo man sich auch leicht mal verschreiben kann. Bei typsicheren DataSets/DataTables bspw. kann man den ColumnName über das Schema abfragen und arbeitet ohne manuell eingegebene Strings. Man kann sich auch eine Klasse bauen, die die Namen als statische öffentliche Konstanten-Strings hält. Der Vorteil ist (und sollte sein), dass bei Änderungen in Datenquellen-Klassen ggf. automatisch die erweiterten/geänderten Stellen schon durch den Compiler markiert werden und, dass man schneller und fehlerfreier die Namen (ggf. mit Intellisense) auswählen kann. Nun, trotzdem hat alles Vor- und Nachteile, die goldene (immer anwendbare) Lösung gibt es da nicht.
    Zur Technik der Validierung ggf. noch Bei Bedarf mit "e.Cancel = true" und der ErrorText-Eigenschaft arbeiten.

    [Exemplarische Vorgehensweise: Validieren von Daten im DataGridView-Steuerelement in Windows Forms]
    http://msdn.microsoft.com/de-de/library/ykdxa0bc.aspx

    Was auch zum Teil unbekannt ist, dass man in seinen Businessobjekten IDataErrorInfo  [->Beispiel, sonst oft nur aus WPF/Silverlight bekannt] implementieren kann, und dann den BindingSource als DataSource für einen eigenen ErrorProvider nutzen kann. Auf diesem Weg können die Businessobjekte selber die Validierung übernehmen und das Grid zeigt Validierungsfehler automatisch an. In Deinem Fall wolltest Du ja eine "größer/kleiner - Prüfung", die dann bspw. über das RangeAttribute geregelt werden könnte. 


    ciao Frank

    Mittwoch, 27. Juli 2011 05:31