Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 29 su 29

Discussione: Estendere datatable

  1. #21
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da sheol
    Quando creo il datatable e inserisco il dato, per catturare l evento che mi richiama OnRowChanged creato da me uso questo codice:

    codice:
    myTable.RowChanged += new DataRowChangeEventHandler(myTable_RowChanged);
    il problema è che quando entra nel mio OnRowChanged il codice va in loop.
    C è un modo per gestire questo loop ad esempio fermandolo al primo passaggio?
    Oppure
    C è un altro metodo di cui fare l'override di cui ignoro l esistenza?

    Ma in debug non vedi -su cosa- esattamente va in loop ?

  2. #22
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    16
    tramite il debugger vedo che non esce dal metodo e mi incrementa la variabile facendo il quadrato del risultato precedente e cosi via.

  3. #23
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    in realtà non va in loop ma in ricorsione infinita e probabilemente ricevi un StackOverFlowExcpetion.
    I got the remedy

  4. #24
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    16
    Originariamente inviato da albgen
    in realtà non va in loop ma in ricorsione infinita e probabilemente ricevi un StackOverFlowExcpetion.
    si l'eccezione che lancia è quella, ho messo anche un try e catch ma niente.

  5. #25
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da sheol
    si l'eccezione che lancia è quella, ho messo anche un try e catch ma niente.
    eh si, è normale che faccia cosi', in quanto tu appena imposti il valore di una colonna dentro al gestore dell'evento, quest'ultimo viene scatenato di nuovo quindi imposta di nuovo la colonna e di nuovo l'evento viene scatenato... e cosi' via...quindi è come se fosse una chiamata ricorsiva senza avere il caso base in cui fermi questa ricorsione...

    Dovresti fare un controllo sul nome della colonna per controllare la ricorsione.
    Posta per intero il codice della classe e quello di prova...che cosi' la vedo/iamo meglio...
    I got the remedy

  6. #26
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    16
    allora questa è la classe che estende datatable

    codice:
    public class MyDataTable : DataTable
    {
        public MyDataTable() { }
    
        internal MyDataTable(string builder)
            : base(builder)
        {
            //
            // TODO: aggiungere qui la logica del costruttore
            //
        }
        
        protected override void OnRowChanged(DataRowChangeEventArgs e)
         {
             
                 //DataRow r = e.Row;
                 //e.Row.Field<int>(
                 int i = (int)e.Row.Field<int>(0);
                 int b = i * i;
                 e.Row.SetField<int>(0, b);
                 base.OnRowChanged(e);
            
             
         }
    
    }
    e questa è la classe di prova

    codice:
    namespace ConsoleApplication1
    {
        class Program
        {
            
            DataColumn myDataColumn;
    
            static void Main(string[] args)
            {
                MyDataTable myTable = new MyDataTable();
                DataColumn myDataColumn;
                myDataColumn = new DataColumn();
                myDataColumn.DataType = Type.GetType("System.Int32");
                myDataColumn.ColumnName = "id";
                myTable.Columns.Add(myDataColumn);
    
                //myTable.TableNewRow += new DataTableNewRowEventHandler(myTable_TableNewRow);
                myTable.RowChanged += new DataRowChangeEventHandler(myTable_RowChanged);
                DataRow row = myTable.NewRow();
                row[0] = 1;
                myTable.Rows.Add(row);
               
    
                Console.WriteLine(row[0]);
                Console.Read();
            }
    
            static void myTable_RowChanged(object sender, DataRowChangeEventArgs e)
            {
               
                throw new NotImplementedException();
                
            }
    
            
    
            
    
            
        }
    }
    Grazie per la pazienza

  7. #27
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Dovrebbe andare bene...

    codice:
     public class MyDataTable : DataTable
        {
            // Flag 
            private bool _modifiedInternally = false;
    
            public MyDataTable() { }
    
            internal MyDataTable(string builder)
                : base(builder)
            {
            }
            
            protected override void OnRowChanged(DataRowChangeEventArgs e)
            {
    
                if (_modifiedInternally)
                    return;
                _modifiedInternally = true;
    
    
    
                int i = (int)e.Row.Field<int>(0);
                int b = i * i;
                e.Row.SetField<int>(0, b);
                base.OnRowChanged(e);
    
    
    
                _modifiedInternally = false;
            }
    
        }
    I got the remedy

  8. #28
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    16
    avevo provato la stessa cosa con una variabile di tipo intero e non booleana e non mi andava ora provo la tua e ti faccio sapere

  9. #29
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    16
    Grande funziona!!!!


    ti offro una birra virtuale :P

    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.