Вы просто собираете первое изображение здесь:
byte[] img = (byte[])dt.Rows[0]["Image"];
измените эту строку кода на
byte[] img = (byte[])row["Image"];
иЕсть много способов избежать нулевых ошибок:
// Using "as" keyword is the best practice only
// in case you are doing null check after the cast
byte[] img = row["Image"] as byte[];
// OR the following will either give you the image or an empty byte array.
byte[] img = row["Image"] as byte[] ?? new byte[];
Но всегда не забывайте проверять наличие нулевых значений, чтобы избежать ошибок.
Вот как должен выглядеть полный код:
private void populateItems()
{
string query = "SELECT * FROM Users";
{
using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
{
//Fill the DataTable with records from Table.
DataTable dt = new DataTable();
sda.Fill(dt);
//Loop and add SelectUser:Usercontrol to FloyLayoutPanel.
foreach (DataRow row in dt.Rows)
{
SelectContacts contact = new SelectContacts();
contact.FirstName = row["FirstName"].ToString();
contact.LastName = row["LastName"].ToString();
contact.Title = row["Title"].ToString();
byte[] img = row["Image"] as byte[];
if(img != null && img.length > 0)
{
MemoryStream ms = new MemoryStream(img);
contact.PublicProfilePic = Image.FromStream(ms);
}
flowUsers.Controls.Add(contact);
}
}
}
}