Visualizzare le tabelle di un database con C#

Rifacendoci sempre all’applicazione “Hello NHibernate” vediamo adesso come migliorare la visualizzazione dei dati inserendo delle tabelle in una form per la visualizzazione e la gestione dei dati dei fornitori e dei prodotti salvati nel database.

Per cominciare creeremo un nuovo progetto chiamato HelloHibernateApplicationFarm definito come Windows Form Project.

In automatico il Visual Studio creerà una form principale e la battezzerà form1 .

Dalla barra degli strumenti “Toolbox” creiamo, a nostro piacimento, una dialog nella quale inseriamo due dataGridView che saranno i componenti che conterranno i dati dei record delle tabelle memorizzate nel database.

Nello specifico, in questo caso, una dataGridView conterrà tutte le informazioni relative ai fornitori e l’altra ai prodotti.

Come in tutti i progetti grafici si può dare libero sfogo alla propria fantasia ed alla propria capacità artistica, io, ad esempio, ho creato la form in questa maniera:

form with empty tables

e che sia chiaro che non si accettano commenti negativi sulla scelta dell’accoppiamento rosa-nero dei colori :) .

Ma vediamo adesso come associare gli eventi all’interfaccia.

Per prima cosa dobbiamo lanciare la creazione della form all’avvio dell’applicazione. Per far ciò creiamo la classe MainForm.cs, sotto il progetto sopra definito, nel quale andremo a definire il metodo main in questa maniera:

namespace HelloHibernateApplicationFarm

{

static class MainForm

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new Form1());

}

}

}

dove lanciamo esplicitamente la classe Form1.

In tale classe, che sino ad adesso abbiamo realizzato mediante il designer, inseriamo le righe di codice legate agli eventi di lettura e scrittura dei dati (ovviamente per tutta la parte di persistenza e per tutta la logica di Hibernate continueremo ad utilizzare gli stessi metodi delle stesse classi degli stessi progetti prima definiti…).

A tal punto all’evento di lettura dei dati (per creare il metodo basta fare doppio clic col mouse sul button apposito dell’interfaccia grafica dal design) associamo il codice:

private void buttonRead_Click(object sender, EventArgs e)

{

//Istanzio due variabili locali per l’accesso al DAO

SupplierDAO suppDao = new SupplierDAO();

ProductDAO prodDao = new ProductDAO();

IList suppliers = Program.readAndViewSuppliers(suppDao);

IList products = Program.readAndViewProduct(prodDao);

fillSuppliersTable(suppliers);

fillProductsTable(products);

}

dove si richiamano i metodi readAndViewSuppliers e readAndViewProduct dalla classe Program.cs usata come classe di avvio nei progetti precedenti, e dove vengono richiamati i metodi fillSuppliersTable e fillProductsTable così definiti:

private void fillSuppliersTable(IList suppliers)

{

dataGridView1.Rows.Clear();

foreach (Supplier supplier in suppliers)

{

dataGridView1.Rows.Add(new object[9] { supplier.LastName, supplier.FirstName, supplier.BusinessName, supplier.FiscalCode, supplier.Address, supplier.Phone, supplier.Mail, supplier.Note, supplier.Code });

}

}

private void fillProductsTable(IList products)

{

dataGridView2.Rows.Clear();

foreach (Product product in products)

{

dataGridView2.Rows.Add(new object[7] { product.Name,product.Category, product.PiecesInStock, product.Price, product.Supplier.BusinessName,product.Note, product.Code });

}

}

che si occupano di popolare i dataGrid aggiungendo, di volta in volta, un array di oggetti con i campi da visualizzare.

Cosa molto simile viene fatta per il salvataggio dei dati creando il metodo legato all’evento di click sul pulsante “Salva” dell’interfaccia principale:

private void buttonSave_Click(object sender, EventArgs e)

{

IList tableSuppliers = readSuppliersFromTable();

SupplierDAO suppDAO = new SupplierDAO();

suppDAO.SaveSuppliersList(tableSuppliers);

IList tableProducts = readProductsFromTable();

ProductDAO prodDAO = new ProductDAO();

prodDAO.SaveProducts(tableProducts);

}

nel quale prima vengono letti i dati dalle due tabelle tramite i metodi readSuppliersFromTable e readProductsFromTable così definiti:

private IList readSuppliersFromTable()

{

IList suppliers = new ArrayList();

for (int i = 0; i < dataGridView1.RowCount – 1; i++)

{

Supplier supplier = new Supplier();

if (dataGridView1.Rows[i].Cells[0].Value != null)

supplier.LastName = dataGridView1.Rows[i].Cells[0].Value.ToString();

if (dataGridView1.Rows[i].Cells[1].Value != null)

supplier.FirstName = dataGridView1.Rows[i].Cells[1].Value.ToString();

if (dataGridView1.Rows[i].Cells[2].Value != null)

supplier.BusinessName = dataGridView1.Rows[i].Cells[2].Value.ToString();

if (dataGridView1.Rows[i].Cells[3].Value != null)

supplier.FiscalCode = dataGridView1.Rows[i].Cells[3].Value.ToString();

if (dataGridView1.Rows[i].Cells[4].Value != null)

supplier.Address = dataGridView1.Rows[i].Cells[4].Value.ToString();

if (dataGridView1.Rows[i].Cells[5].Value != null)

supplier.Phone = dataGridView1.Rows[i].Cells[5].Value.ToString();

if (dataGridView1.Rows[i].Cells[6].Value != null)

supplier.Mail = dataGridView1.Rows[i].Cells[6].Value.ToString();

if (dataGridView1.Rows[i].Cells[7].Value != null)

supplier.Note = dataGridView1.Rows[i].Cells[7].Value.ToString();

if (dataGridView1.Rows[i].Cells[8].Value != null)

supplier.Code = dataGridView1.Rows[i].Cells[8].Value.ToString();

suppliers.Add(supplier);

}

return suppliers;

}

private IList readProductsFromTable()

{

IList products = new ArrayList();

SupplierDAO suppDAO = new SupplierDAO();

for (int i = 0; i < dataGridView2.RowCount – 1; i++)

{

Product product = new Product();

if (dataGridView2.Rows[i].Cells[0].Value != null)

product.Name = dataGridView2.Rows[i].Cells[0].Value.ToString();

if (dataGridView2.Rows[i].Cells[1].Value != null)

product.Category = dataGridView2.Rows[i].Cells[1].Value.ToString();

if (dataGridView2.Rows[i].Cells[2].Value != null)

product.PiecesInStock = Int32.Parse(dataGridView2.Rows[i].Cells[2].Value.ToString());

if (dataGridView2.Rows[i].Cells[3].Value != null)

product.Price = Convert.ToDecimal(dataGridView2.Rows[i].Cells[3].Value.ToString());

if (dataGridView2.Rows[i].Cells[4].Value != null)

{

Supplier supplier = new Supplier();

supplier = suppDAO.GetSupplierByBusinessName(dataGridView2.Rows[i].Cells[4].Value.ToString());

product.Supplier = supplier;

}

if (dataGridView2.Rows[i].Cells[5].Value != null)

product.Note = dataGridView2.Rows[i].Cells[5].Value.ToString();

if (dataGridView2.Rows[i].Cells[6].Value != null)

product.Code = dataGridView2.Rows[i].Cells[6].Value.ToString();

products.Add(product);

}

return products;

}

laddove è di semplice comprensione la lettura dei dati direttamente dalle celle del dataGridView scandite prima con due cicli for per le righe e per le colonne.

Dopo aver letto i dati e aver ottenuto le liste con le entità relative ai fornitori ed ai prodotti nuovi e/o modificati dall’interfaccia, vengono quindi richiamati i metodi di salvataggio tramite gli appositi DAO.

E il gioco è fatto :

form with tables and values

OSS. Questo, in C#, non è l’unico metodo di visualizzazione dei dati delle tabelle dei database; infatti ne esistono degli altri che utilizzano oggetti diversi dai dataGridView per l’associazione dei record delle tabelle dei database con le celle delle tabelle delle form. Ho scelto questa, in questo articolo, perché la ritengo una delle più semplici e delle più utilizzate e magari in qualche prossimo post proveremo ad utilizzarne qualche altra ed a valutarne concretamente vantaggi e svantaggi.

Lascia un commento