winform .net melhor maneira se você quiser exibir imagens em um datagridview

net webdeveloper e geralmente não fazem quaisquer aplicativos win32. mas agora eu tenho que. Eu tenho uma lista com cerca de 2000 entradas. cada entrada deve ser exibida como um rótulo com caixa de texto outro rótulo e imagem. Eu fiz isso com um flowlayoutpanel e fiz um foreach nas entradas para fazer um painel para cada entrada com o rótulo, caixa de texto, etiqueta e um picturebox.

Agora eu tenho problemas de renderização quando se trata acima de 1000 entradas. então eu li que eu deveria usar um listview ou datagridview.

Agora eu tenho um datagridview como este:

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;

mas o problema é que um bitmap em uma datagridview é muito lento! a opção de picturebox e painéis que eu tinha antes, onde muito mais rápido. Como eu resolvo isso?

a segunda pergunta é: qual evento eu preciso quando quero acompanhar as alterações feitas na segunda coluna?

Uma coisa: as imagens estão disponíveis on-line para que o 'pd.ProductImage' seja uma 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
        }
    }

questionAnswers(2)

yourAnswerToTheQuestion