C# 中DataGridView和ListView閃爍問題的解決方法


方法一
首先定義類,將此類放在datagridview或ListView所在的窗體類外面,然后代碼如下,

// <summary>
/// 雙緩沖DataGridView,解決閃爍
/// 使用方法:在DataGridView所在窗體的InitializeComponent方法中更改控件類型實例化語句將
/// this.dataGridView1 = new System.Windows.Forms.DataGridView();   屏蔽掉,添加下面這句即可
/// this.dataGridView1 = new DoubleBufferListView();
/// </summary>
class DoubleBufferDataGridView : DataGridView
{
    public DoubleBufferDataGridView()
    {
        SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        //UpdateStatus.Continue;
        UpdateStyles();
    }
}

/// <summary>
/// 雙緩沖ListView ,解決閃爍
/// 使用方法是在ListView 所在窗體的InitializeComponent方法中,更改控件類型實例化語句將
/// this.listView1 = new System.Windows.Forms.ListView();    屏蔽掉, 添加下面語句即可
/// this.listView1 = new DoubleBufferListView();
/// </summary>
class DoubleBufferListView : ListView
{
    public DoubleBufferListView()
    {
        SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        UpdateStyles();
    }
}

  

方法二
直接寫一個擴展方法,使用反射,直接上代碼,將此類定義給DataGirdView或ListView所在的窗體類外面即可

public static class DoubleBufferDataGridView
{
    /// <summary>
    /// 雙緩沖,解決閃爍問題
    /// </summary>
    /// <param name="dgv"></param>
    /// <param name="flag"></param>
    public static void DoubleBufferedDataGirdView(this DataGridView dgv, bool flag)
    {
        Type dgvType = dgv.GetType();
        PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(dgv, flag, null);
    }
}

public static class DoubleBufferListView
{
    /// <summary>
    /// 雙緩沖,解決閃爍問題
    /// </summary>
    /// <param name="lv"></param>
    /// <param name="flag"></param>
    public static void DoubleBufferedListView(this  ListView lv, bool flag)
    {
        Type lvType = lv.GetType();
        PropertyInfo pi = lvType.GetProperty("DoubleBuffered",
            BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(lv, flag, null);
    }

}

//調用方法
public Form1()
{
    InitializeComponent();
    DataGridView1.DoubleBufferedDataGirdView(true);
}

  其實很簡單的,一看代碼就能明白,使用雙緩沖解決閃爍問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM