Riprendiamo la seconda parte dell'articolo riguardante l'utilizzo del controllo DatagridView con il quale andremo a salvare l'immagine presente in una colonna della griglia.
Come si vede dal frammento di codice precedente, la funzione ha tre parametri, uno di tipo image, utilizzato poi da una classe di tipo “Bitmap, due parametri di tipo int, riguardante l’altezza e larghezza, ed infine il percorso e nome file dove salvare il file, tramite la classe Bitmap.
Se passiamo in visualizzazione design, tramite la finestra delle proprietà del controllo datagrid, possiamo gestire l’evento che permette di visualizzare una finestra per indicare all’utente il percorso e nome del file che si vuole salvare sul pc.
L’evento per gestire il click all’interno della cella è “CellContentClick” se facciamo doppio click, si passerà in visualizzazione codice, a questo punto verifichiamo se la cella è vuota o no, indicando il numero di riga e numero di colonna, e poi procedere al relativo salvataggio.
Verrà creato un oggetto di tipo SaveFileDialog, con il quale andremo ad impostare alcune proprietà che permettono il salvataggio dei file in formato immagine.
Inoltre si converte il contenuto della cella qualora è valorizzato in un oggetto di tipo “Image”
Verrà richiamata la funzione per ridefinire l’immagine, in modo viene generato senza problemi.
Qui di seguito si riporta il codice delle suddette dichiarazioni.
VB.Net
Private Sub dataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dataGridView1.CellContentClick
If e.ColumnIndex = 2 Then
If dataGridView1.Rows(e.RowIndex).Cells(2).Value IsNot Nothing Then
Dim salvaFile As SaveFileDialog = New SaveFileDialog()
salvaFile.Filter = "Immagine(.JPG)|*.jpg"
salvaFile.Title = "Salva file sul pc"
salvaFile.CheckPathExists = True
If salvaFile.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
Dim ImmagineRilevata As Image = (TryCast(dataGridView1.Rows(e.RowIndex).Cells(2).Value, Image))
RidefinisciImmagine(ImmagineRilevata, ImmagineRilevata.Height, ImmagineRilevata.Width, salvaFile.FileName)
End If
End If
End If
End Sub
C#
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 2)
{
if (dataGridView1.Rows[e.RowIndex].Cells[2].Value != null)
{
SaveFileDialog salvaFile = new SaveFileDialog();
salvaFile.Filter = "Immagine(.JPG)|*.jpg";
salvaFile.Title = "Salva file sul pc";
salvaFile.CheckPathExists = true;
if (salvaFile.ShowDialog()== System.Windows.Forms.DialogResult.OK)
{
Image ImmagineRilevata = (dataGridView1.Rows[e.RowIndex].Cells[2].Value as Image);
RidefinisciImmagine(ImmagineRilevata, ImmagineRilevata.Height, ImmagineRilevata.Width, salvaFile.FileName);
}
}
}
}
Siamo giunti alla conclusione della stesura del codice, ora dovremmo scrivere le istruzioni per caricare la griglia.
Qui di seguito il codice, supponendo di avere una nostra immagine nel nostro computer.
Il frammento di codice è molto semplice, perché simula una fonte dati.
L’esecuzione del codice, avviene nell’evento Load della nostra form, naturalmente in una riga abbiamo lo stream dell’immagine, relativo ad un file che abbiamo sul nostro pc, mentre nell’altra no, per verificare se la cella è vuota oppure valorizzata.
Verrà richiamata la funzione GetImmagine, per trasformare un array byte (di solito presente in una base dati) in un classe di tipo “Image”.
Qui di seguito l’esempio di codice per entrambi i linguaggi.
VB.Net
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ListOggetti As List(Of OggettoNuovo) = New List(Of OggettoNuovo)()
Dim oggetto As OggettoNuovo = New OggettoNuovo()
oggetto.nome = "Emanuele"
oggetto.Cognome = "Mattei "
oggetto.Immagine = File.ReadAllBytes("D:\test.jpg")
ListOggetti.Add(oggetto)
oggetto = New OggettoNuovo()
oggetto.nome = "Luigi"
oggetto.Cognome = "Cristaldi"
ListOggetti.Add(oggetto)
Dim risultato = (From dati In ListOggetti Select New With {Key .Nominativo = dati.nome, Key .CognomeNominativo = dati.Cognome, Key .Foto = If(dati.Immagine Is Nothing, Nothing, getImmagine(dati.Immagine))})
dataGridView1.RowTemplate.Height = 100
dataGridView1.AutoGenerateColumns = False
dataGridView1.Columns(0).ValueType = GetType(String)
dataGridView1.DataSource = risultato.ToList()
End Sub
C#
private void Form1_Load(object sender, EventArgs e)
{
List<OggettoNuovo> ListOggetti = new List<OggettoNuovo>();
OggettoNuovo oggetto = new OggettoNuovo();
oggetto.nome = "Emanuele";
oggetto.Cognome = "Mattei ";
oggetto.Immagine = File.ReadAllBytes("D:\\test.jpg");
ListOggetti.Add(oggetto);
oggetto = new OggettoNuovo();
oggetto.nome = "Luigi";
oggetto.Cognome = "Cristaldi";
ListOggetti.Add(oggetto);
var risultato = (from dati in ListOggetti
select new
{
Nominativo = dati.nome,
CognomeNominativo = dati.Cognome,
Foto = dati.Immagine==null?null:getImmagine(dati.Immagine)
});
dataGridView1.RowTemplate.Height = 100;
dataGridView1.AutoGenerateColumns = false;
dataGridView1.Columns[0].ValueType = typeof(string);
dataGridView1.DataSource = risultato.ToList();
}
Conclusioni
L’articolo ha voluto fornire informazioni sull’utilizzo del controllo DatagridView in ambiente Windows Application, il quale si presenta in maniera semplice e flessibile sulla gestione dei dati.
Un controllo, al quale il programmatore può sfruttare le numerose funzionalità messe a disposizione ed al tempo stesso estendere quelli presenti, anche se il controllo ha numerose proprietà e funzioni.
Abbiamo voluto illustrare di come nelle nostre applicazioni di tipo gestionali possiamo offrire all’utente un’interfaccia amichevole e con la possibilità di vedere rapidamente le informazioni richieste.
Qui https://www.iprogrammatori.it/articoli/programmazione/art_net-datagridview-salvare-da-una-colonna-_1627.aspx la prima parte