Come inizializzare una Hashtable in C# 3.0

dategiovedì 21 gennaio 2010 alle 21.44  - posted by Manuel Scapolan in C# | Tips and Tricks

Tra le novità introdotte dalla versione 3.0 del .NET framework troviamo gli "Initializers" normalmente utilizzati per inizializzare le proprietà di un oggetto direttamente nella chiamata al costruttore, ad esempio:

Person aPerson = new Person(){ Name = "Mario", Surname = "Rossi" };

Analogamente possiamo utilizzare la stessa funzionalità anche per le collezioni e nello specifico vediamo come inizializzare una Hashtable:

Hashtable aCollection = new Hashtable(){ 
                                          { "Key1", "Value1" }, 
                                          { "Key2", "Value2" } 
                                       };

Le migliori shortcuts di Visual Studio 2008

datemartedì 27 ottobre 2009 alle 21.22  - posted by Manuel Scapolan in Tips and Tricks

Le shortcuts sono sicuramente la via più breve e semplice per migliorare la produttività. Ecco un elenco delle migliori tra quelle a disposizione con Visual Studio 2008:

  • [CTRL] + [SHIFT] + [B] -> esegue il build della solution
  • [CTRL] + [SHIFT] + [S] -> salva tutti i file aperti
  • [CTRL] + [I] -> attiva la funzione di ricerca incrementale. Dopo aver premuto tale combinazione digitare la chiave di ricerca ed una volta completata la chiave spostarsi in avanti sempre con CTRL + I ed indietro con CTRL + SHIFT + I
  • [F5] e [SHIFT] + [F5] -> il primo fa partire il debug l'altro lo interrompe
  • [SHIFT] + [F9] -> pone la variabile selezionata dal cursore sotto "Quick Watch" 
  • [CTRL] + [SHIFT] + [Space] -> posizionandosi all'interno della chiamata di un metodo permette di vedere in un tooltip la lista di parametri richiesta dal metodo
  • [CTRL] + [.] -> apre la finestra smart tag utile in caso di inserimento di uno using per un tipo sconosciuto
  • ([CTRL] + [K]) + [F]-> esegue la formattazione della selezione corrente
  • ([CTRL] + [K]) + [C] e ([CTRL] + [K]) + [U] -> il primo commenta le righe selezionate, l'altro esegue l'operazione inversa
  • [ALT] + [SHIFT] + [Enter] -> attiva la modalità FULL SCREEN, ripremere la stessa combinazione di tasti per disattivare la modalità
  • ([CTRL] + [\]) + [D] -> apre la finestra Code Definition per il tipo sotto cursore
  • [CTRL] + [SHIFT] + [F] -> permette di eseguire la funzione di ricerca nei file del progetto
  • [SHIFT] + [Canc] -> cancella la riga corrente salvandola negli appunti
  • [CTRL] + [-] e [CTRL] + [SHIFT] + [-] -> sposta il cursore nella posizione successiva o precedente
  • [F12] -> esegue il "Go to definition"

Tra le più curiose ci sono invece:

  • [CTRL] + [ì] -> se mi posiziono su una parentesi di un blocco di codice ed eseguo questa combinazione di tasti il cursore si posiziona sull'altra parentesi che delimita il blocco
  • [CTRL] + [SHIFT] + [ì] -> se mi posiziono su una parentesi di un blocco di codice con questa combinazione seleziono tutto il blocco di codice
  • [CTRL] + []] -> seleziona il pezzo di codice compreso tra il cursore e l'ultima posizione di modifica
  • [CTRL] + [T] ->inverte le lettere ai lati del cursore

 E se non ci bastano dalla finestra Tools > Options > Keyboard ne possiamo creare di nuove:
 

Custom Shortcuts

Impedire l'override di una funzione d'accesso per una property virtual in C#

datemartedì 20 ottobre 2009 alle 17.55  - posted by Manuel Scapolan in Tips and Tricks | C#

In C# quando definiamo per una classe base una property virtual possiamo nelle classi derivate eseguire l'override dei metodi d'accesso get e set.

E se non volessimo dare la possibilità alle classi derivate di eseguire l'override di entrambi i metodi? In questo caso è sufficiente dichiarare uno dei due metodi private come nell'esempio seguente:

public abstract class ClassA
{
   public virtual bool PropertyC 
   {
      get;
      private set; // non virtual
   }
}
 
public class ClassB : ClassA
{
   public override bool PropertyC
   {
      get
      {
         return false;
      }
   }
}

tagsTags:

DataGridView e TableAdapter: Update in-line e Performance Tip

datemercoledì 24 giugno 2009 alle 22.08  - posted by Manuel Scapolan in Tips and Tricks

Se dobbiamo sviluppare applicazioni Windows Form "quick and dirty" su basi di dati non troppo complesse, niente ereditarietà o self-relationship per intenderci, con il DataSet ed i TableAdapter possiamo soddisfare le nostre esigenze con un po' di drag and drop ed alcuni click del mouse.

Update in-line

Tutto bello se non fosse che per quello che non ci viene dato in automatico dobbiamo sudare le famose 7 camicie. Mi è capitato recentemente di dover applicare ad una DataGridView collegata ad un DataSet la modifica in-line, ovvero il salvataggio dei dati all'uscita dalla cella. Dopo innumerevoli tentativi sono giunto alla seguente conclusione:

private void dataGridView1_CellValueChanged
   (object sender, DataGridViewCellEventArgs e)
{
   this.dataGridView1.EndEdit();
   this.customersBindingSource.EndEdit();
   if (this.dataSet1.HasChanges(DataRowState.Modified))
   {
      this.customersTableAdapter.Update(this.dataSet1.Customers);
   }
}

In pratica nell'handler dell'evento CellValueChanged del DataGridView procedo alla chiamata dei metodi EndEdit rispettivamente sulla DataGridView e sul BindingSource collegato in modo da propagare la modifica alla sorgente dati bindata alla griglia. Successivamente controllo se ci sono modifiche (può essere omesso visto lo scopo dell'evento scatenato) ed a quel punto chiamo il metodo Update del TableAdapter che procede alla persistenza dei dati sullo storage.

Performance tip

Lavorando con un insieme maggiore di record il TableAdapter soffre di un po' di lentezza se gli passiamo nel metodo Update tutta la tabella. Per migliorare le performance possiamo utilizzare direttamente il DataAdapter, accessibile tramite la proprietà Adapter, al quale passiamo un dataset con le modifiche da persistere, ecco come fare:

private void dataGridView1_CellValueChanged
   (object sender, DataGridViewCellEventArgs e)
   this.dataGridView1.EndEdit();
   this.customersBindingSource.EndEdit();
   if (this.dataSet1.HasChanges(DataRowState.Modified))
   {
      DataSet ds = this.dataSet1.GetChanges(DataRowState.Modified);
      this.customersTableAdapter.Adapter.Update(ds);
   }
}

Quando si lavora con il DataSet devono essere gestite opportunamente concorrenza e caricamento dei dati in modo da evitare perdita di informazioni ed un utilizzo pesante delle risorse. Nel primo caso la gestione viene definita tramite opportuna configurazione del TableAdapter, nel secondo caso è compito nostro implementare dei meccanismi di paginazione dei dati, ma questa è un'altra storia...

About me

manuel scapolanSono un consulente informatico. Nel 2004 terminati gli studi in Ingegneria Informatica (1° livello), ho iniziato come freelance collaborando con una ditta di consulenza informatica ed una agenzia di marketing e comunicazione nello sviluppo di applicazioni web. Attualmente divido il lavoro di sviluppatore e progettista web con attività di formazione nel settore della programmazione.
View Manuel Scapolan's profile on LinkedIn

Follow me on Follow manuelscapolan on Twitter

Calendario


<<  settembre 2010  >>
lumamegivesado
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Disclaimer

Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati mediante:
creative commons
Attribuzione: Non commerciale
Condividi allo stesso modo. R.2.5

Books (a bit more about my library)

Domain Driven Design - Eric Evans Applying Domain-Driven Design and Patterns - Jimmy Nilsson Refactoring to Patterns - Joshua Kerievsky Design Patterns -  Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides Code Complete Second Edition - Steve McConnell Patterns of Enterprise Application Architecture - Martin Fowler Agile Principles, Patterns, and Practices in C# - Robert C. Martin xUnit Test Patterns - Gerard Meszaros Refactoring - Martin Fowler CLR via C# Second Edition - Jeffrey Richter Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries - Krzysztof Cwalina, Brad Abrams Don't make me think! - Steve Krug Bulletproof Ajax - Jeremy Keith

Manuel Scapolan Copyright © 2007 - 2010 - Tutti i diritti riservati - Powered by BlogEngine.NET 1.5.0.7 - silk icons by famfamfam - Time CET