domenica 20 settembre 2026
GitHub: come modificare la presentazione di un repository con README.md
sabato 19 settembre 2026
C# ADO.NET: mappare le proprietà di un oggetto in un DataRow e aggiungerlo a un DataTable
Il seguente frammento di codice in C# illustra una tecnica, utilizzando ADO.NET, per mappare i dati presenti nelle proprietà di un oggetto nelle colonne di un DataTable.
In particolare, viene creato un oggetto di tipo DataRow nel quale vengono copiati i valori delle proprietà dell'oggetto che hanno un nome corrispondente a quello delle colonne presenti nel DataTable.
La classe di esempio
Di seguito viene riportata la classe che utilizzeremo nell'esempio:
C#
class Anagrafica
{
public string Nome { get; set; } = string.Empty;
public string Cognome { get; set; } = string.Empty;
public DateTime
DataNascita { get; set; }
}
Il DataTable
Per l'esempio utilizziamo un oggetto di tipo DataTable:
C#
private DataTable
dttDati = new DataTable();
La funzione per il mapping
La seguente funzione si occupa di copiare nel DataRow i valori presenti nelle proprietà dell'oggetto.
Per ottenere le proprietà dell'oggetto viene utilizzata la Reflection tramite il metodo GetProperties().
Per ogni proprietà viene verificato se nel DataTable esiste una colonna con lo stesso nome. In caso affermativo, il valore della proprietà viene assegnato alla relativa colonna del DataRow.
C#
private void MappaDtoObjectInDataRow(object dto, DataRow r)
{
foreach (var prop in dto.GetType().GetProperties())
{
if
(dttDati.Columns.Contains(prop.Name))
{
r[prop.Name] = prop.GetValue(dto) ?? DBNull.Value;
}
}
}
In questo modo, ad esempio, la proprietà Nome dell'oggetto viene associata alla colonna Nome del DataTable, la proprietà Cognome alla colonna Cognome e così via.
Esempio di utilizzo
Di seguito viene mostrato un esempio di utilizzo della funzione, ad esempio all'interno dell'evento Load di una Form oppure nell'evento Click di un pulsante.
Per prima cosa vengono definite le colonne del DataTable:
C#
dttDati.Columns.Add(new DataColumn("Nome"));
dttDati.Columns.Add(new DataColumn("Cognome"));
dttDati.Columns.Add(new DataColumn("DataNascita"));
Successivamente viene creato un oggetto Anagrafica:
C#
Anagrafica nominativo =
new Anagrafica
{
Nome = "Emanuele",
Cognome = "Mattei",
DataNascita
= DateTime.Now
};
A questo punto viene creato un nuovo DataRow utilizzando il metodo NewRow() del DataTable:
C#
DataRow riga = dttDati.NewRow();
Il metodo MappaDtoObjectInDataRow() viene quindi utilizzato per copiare nel DataRow i valori presenti nelle proprietà dell'oggetto:
C#
MappaDtoObjectInDataRow(nominativo, riga);
Infine, il DataRow viene aggiunto al DataTable:
C#
dttDati.Rows.Add(riga);
Il risultato è quindi un DataTable nel quale i valori dell'oggetto Anagrafica sono stati associati alle colonne aventi lo stesso nome delle relative proprietà.
venerdì 18 settembre 2026
Download gioco gratuito SpecialForce Remaster
SpecialForce Remaster è uno sparatutto in prima persona (FPS) disponibile gratuitamente per PC Windows sulla piattaforma Epic Games Store.
Il gioco propone modalità multiplayer a squadre, combattimenti frenetici e diverse modalità di gioco, tra cui Team Deathmatch, Free for All e modalità a obiettivi. È disponibile con testi e audio in inglese
Per maggiori informazioni e download, visitate il seguente sito https://store.epicgames.com/p/special-force-remastered-8989d7
Error 19 "UNIQUE constraint failed" con SQLite ed Entity Framework Core C#
modelBuilder.Entity<NomeTabella>(entity => { entity.HasKey(e => e.IdCampoChiaveContatore); entity.Property(e => e.IdCampoChiaveContatore).ValueGeneratedOnAdd();
entity.Property(e => e.CampoDate).HasColumnType("DATETIME"); });
giovedì 17 settembre 2026
C# Entity Framework Core e SQLite: errore "SQLite Error 14: unable to open database file"
mercoledì 16 settembre 2026
C# Filtrare i record di un DataTable in base alla selezione di un DataGridView
In questo frammento di codice C# vediamo come, selezionando una riga di un controllo DataGridView, sia possibile recuperare il valore di un campo chiave e utilizzarlo per filtrare i record contenuti in un DataTable.
In questo modo vengono restituiti solamente i record che hanno nel campo chiave lo stesso valore dell'ID della riga selezionata.
Il DataGridView deve contenere una colonna ID nascosta, che utilizzeremo per effettuare la condizione di filtro.
Una volta applicato il filtro, i dati vengono ordinati e proiettati nei campi necessari, per poi essere assegnati come DataSource a un secondo DataGridView.
Aggiungere lo spazio dei nomi System.Linq
C#
private void datagridview1_SelectionChanged(object sender, EventArgs e)
{
try
{
if (datagridview1.CurrentRow == null || datagridview1.CurrentRow.IsNewRow)
return;
var IdRecord = datagridview1.CurrentRow.Cells["ColonnaIDNascosta"].Value;
if (IdRecord == null || IdRecord == DBNull.Value)
return;
var righeFiltrate = dataTableDati.AsEnumerable()
.Where(r => (r.Field<int?>("CampoChiave ") ?? -1) == Convert.ToInt32(IdRecord ))
.OrderBy(r => Convert.ToString(r["CampoDataTable"]))
.Select(r => new
{
Campo = Convert.ToString(r["CampoA"]),
CampoB = Convert.ToString(r["CampoB "]),
CampoUnionte =
$"{Convert.ToString(r["CampoC "])}-{Convert.ToString(r["CampoD"])}",
CampioC = Convert.ToString(r["CampoE"])
})
.ToList();
datagridview2.DataSource = righeFiltrate;
}
catch (Exception ex)
{
Messagebox.Show("Impossibile caricare i dati.", “Errore”,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
martedì 15 settembre 2026
C# realizzare una galleria fotografica con .NET 10 e Windows Forms
C#
private void BtnTrovaCartella_Click(object sender, EventArgs e)
{
try
{
using (FolderBrowserDialog folderBrowserDialog =
new FolderBrowserDialog())
{
folderBrowserDialog.Description
= "Seleziona la cartella dove si trovano i file
Immagine";
folderBrowserDialog.RootFolder
= Environment.SpecialFolder.Desktop;
if (folderBrowserDialog.ShowDialog()
== DialogResult.OK)
{
// Imposto il percorso selezionato
nella casella di testo
TxtPercorsoImmagini.Text = folderBrowserDialog.SelectedPath;
}
}
}
catch (Exception)
{
throw;
}
}
C#
private string[] imgFiles;
private int
indiceCorrente = 0;
C#
private void LoadImagesDaCartella(string cartella)
{
try
{
if (!Directory.Exists(cartella))
{
Directory.CreateDirectory(cartella);
}
// Filtra solo formati immagine comuni
imgFiles = Directory.GetFiles(cartella)
.Where(file =>
file.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)
||
file.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase)
||
file.EndsWith(".png", StringComparison.OrdinalIgnoreCase)
||
file.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase)
||
file.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)
)
.ToArray();
}
catch (Exception ex)
{
MessageBox.Show($"Errore nel caricamento immagini: {ex.Message}", "Errore", MessageBoxButtons.OK,
MessageBoxIcon.Error);
imgFiles
= Array.Empty<string>();
}
}
C#
private void timer1_Tick(object sender, EventArgs e)
{
try
{
indiceCorrente = (indiceCorrente + 1) % imgFiles.Length;
pcbGalleria.Image?.Dispose(); // Libera la
precedente immagine
pcbGalleria.Image = Image.FromFile(imgFiles[indiceCorrente]);
}
catch (Exception ex)
{
timer1.Stop();
MessageBox.Show($"Errore durante il caricamento dell'immagine: {ex.Message}", "Errore", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
C#
private void BtnAvvia_Click(object sender, EventArgs e)
{
if
(TxtPercorsoImmagini.Text.Trim()
== "")
{
MessageBox.Show($"Seleziona un percorso dove sono presenti le
immagini", "Gallery", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
LoadImagesDaCartella(TxtPercorsoImmagini.Text);
if
(imgFiles.Length > 0)
{
indiceCorrente = 0;
pcbGalleria.Image?.Dispose();
pcbGalleria.Image = Image.FromFile(imgFiles[indiceCorrente]);
timer1.Interval = (int)nudSecondi.Value;
timer1.Start();
}
else
MessageBox.Show("Nessuna immagine trovata nella cartella
'Images'.", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}








