0

私は以下のようなWinFormを持っています。本質的にUser ControlFlowLayoutPanelを使用してDataGridViewを記入します。DataGridViewでUserControlの背景イメージを使用して点滅しますか?

ユーザーコントロールがDataTableとUCのBackgroundImageプロパティにバインドされている3つのLabelsDataTableに応じて設定されています。

これはFormです:

public partial class Form1 : Form 
{ 
    DataGridView dataGridView1 = new DataGridView(); 
    DataTable DT = null; 
    public Form1() 
    { 
     InitializeComponent(); 
     dataGridView1.DataSourceChanged += dataGridView1_DataSourceChanged; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     DT = GetRooms(); 
     dataGridView1.DataSource = DT; 
    } 
    private void dataGridView1_DataSourceChanged(object sender, EventArgs e) 
    { 
     DataTable dt = (DataTable)dataGridView1.DataSource; 
     flowLayoutPanel1.Controls.Clear(); 
     foreach (DataRow row in dt.Rows) 
     { 
      UCBind ucb = new UCBind(row, imageList1); 
      flowLayoutPanel1.Controls.Add(ucb); 
     } 
    } 
} 

と、これはUser Controlです:

public partial class UCBind : UserControl 
{ 
    ImageList imgList { get; set; } 

    public UCBind() 
    { 
     InitializeComponent(); 
    } 

    public UCBind(DataRow row, ImageList imglist) 
    { 
     InitializeComponent(); 
     if (row != null) 
     { 
      imgList = imglist; 
      DisplayData(row); 
     } 
    } 

    public void DisplayData(DataRow row) 
    { 
     label1.Text = row.Field<string>(7) + ""; 
     label2.Text = row.Field<string>(8); 
     label3.Text = row.Field<string>(9); 
     BackgroundImage = imgList.Images[0]; // I just display an image here 

    } 
} 

問題は、ラベルがある背景の一部にちらつきのかなりがあるということですユーザーコントロールの上部にあります。それは最終的に自分自身を修正し、すべてが正しいように見えますが、ちらつきが非常に顕著である:それは正しく見える程度秒後

enter image description here

enter image description here

はこのちらつきを解消する方法はありますか?私はまた、flowLayoutPanelAutoScrollをtrueに設定しています。また、何トンものちらつきがあります。

私はthis solutionと同じようなものを試しましたが、DoubleBufferedプロパティをtrueに設定しましたが、まだまだちらつきがたくさんあります。

ありがとうございました。

+1

は 'flowLayoutPanel1.SuspendLayout()を追加し'と 'flowLayoutPanel1.ResumeLayout()'の前と後のループまたは使用のために行くお試しください'flowLayoutPanel1Controls.AddRange(..)'。また、 'this.Doublebuffered = true;'を 'UCBind'コンストラクタに追加することもお勧めします。 – TaW

+0

'this.Doublebuffered = true'を追加しました。うまくいきました。あなたが望むなら、あなたはそれを答えとして加えることができ、私は受け入れます。助けてくれてありがとう。 – rbhat

答えて

0

UserControlは、Labelsだけでなく、BackgroundImageも保持しているので、DoubleBufferingから大きく利益を得ます。あなたがcontructorsのそれぞれに次の行を追加する必要があり、それを有効にするに

public UCBind() 
{ 
    InitializeComponent(); 
    this.Doublebuffered = true; 
} 

と:

public UCBind(DataRow row, ImageList imglist) 
{ 
    InitializeComponent(); 
    this.Doublebuffered = true; 

    if (row != null) 
    { 
     imgList = imglist; 
     DisplayData(row); 
    } 
} 

あなたがいずれかの方法でプロセスをスピードアップすることができUCの追加:

  • ループを囲んで、FlowLayoutPanelに追加する場合は、flowLayoutPanel1.SuspendLayout();flowLayoutPanel1.ResumeLayout();
  • またはList<UCBind>でUCを収集し、次にAddRangeメソッドを使用してすべてを一度に追加できます。ここで

修正ループを有する第二のオプションです:

List<UCBind> ucs = new List<UCBind>(); 
foreach (DataRow row in dt.Rows) 
{ 
    UCBind ucb = new UCBind(row, imageList1); 
    ucs.Add(ucb); 
} 
flowLayoutPanel1.Controls.AddRange(ucs.ToArray()); 
+0

もう一度お手伝いしてくれてありがとう。 – rbhat

関連する問題