winform .net es la mejor manera si quiere mostrar imágenes en una vista de datos

net webdeveloper y por lo general no hacen ninguna aplicación de win32. pero ahora tengo que Tengo una lista con alrededor de 2000 entradas. Cada entrada debe mostrarse como, una etiqueta con cuadro de texto, otra etiqueta y una imagen. He hecho esto con un flowlayoutpanel e hice un foreach en las entradas para hacer un panel para cada entrada con la etiqueta, el cuadro de texto, la etiqueta y una caja de imágenes.

Ahora tengo problemas de renderizado cuando se trata de más de 1000 entradas. así que he leído que debo usar una vista de lista o datagridview.

Ahora tengo una vista de datos como esta:

DataGridView dgv = new DataGridView();
dgv.AutoSize = true;
dgv.ScrollBars = ScrollBars.Vertical;

System.Data.DataTable dt = new System.Data.DataTable();
DataColumn dc1 = new DataColumn("Code", typeof(string));
dc1.ReadOnly = true;
dt.Columns.Add(dc1);
dt.Columns.Add(new DataColumn("Quantity", typeof(int)));
DataColumn dc3 = new DataColumn("Price", typeof(string));
dc3.ReadOnly = true;
dt.Columns.Add(dc3);
dt.Columns.Add(new DataColumn("Image", typeof(Bitmap)));

foreach (Product pd in products)
{
      DataRow dr = dt.NewRow();
      dr["Code"] = pd.ProductCode;
      dr["Quantity"] = pd.ProductQuantity;
      dr["Price"] = "€ " + String.Format("{0:0,00}", pd.ProductResalePrice.ToString());

      dr["Image"] = BitmapFromWeb(pd.ProductImage);
      dt.Rows.Add(dr);
}

dt.AcceptChanges();
dgv.RowTemplate.Height = 50;
dgv.DataSource = dt;

¡Pero la cosa es que un mapa de bits en una vista de datos es realmente lento! La opción de picturebox y los paneles que tenía antes eran mucho más rápidos. ¿Cómo resuelvo esto?

la segunda pregunta es: ¿qué evento necesito cuando quiero hacer un seguimiento de los cambios realizados en la segunda columna?

Una cosa: las imágenes están disponibles en línea, por lo que 'pd.ProductImage' es una url

    private static Bitmap BitmapFromWeb(string URL)
    {
        try
        {
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL);
            myRequest.Method = "GET";
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream());
            myResponse.Close();

            return bmp;
        }
        catch (Exception ex)
        {
            return null; // if for some reason we couldn't get to image, we return null
        }
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta