DataGridView рисует неправильно - PullRequest
1 голос
/ 02 мая 2011

У меня есть форма, и у нее есть тоны других элементов управления (кнопки, пользовательские элементы управления, метки, панель, вид сетки).Вы можете догадаться, у меня была проблема мерцания.Я попробовал двойной буфер, и он не смог решить.В конце концов я попробовал это:

protected override CreateParams CreateParams
{
    get
    {
        // Activate double buffering at the form level.  All child controls will be double buffered as well.
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;   // WS_EX_COMPOSITED
        return cp;
    }
} 

Мерцание исчезло, но мое представление данных отображается неправильно.Это показывает CellBorders, BorderColors неправильно.На самом деле этот код имеет некоторые проблемы с фоновыми изображениями, линиями и прочим.Почему это и как это можно исправить?

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Я знаю, что этот вопрос немного стар, но лучше поздно, чем никогда ...

Вот обходной путь, чтобы прекратить мерцание, когда пользователь изменяет размеры формы, но без путаницы при рисовании элементов управления, таких как DataGridView. При условии, что ваша форма называется «Form1»:

int intOriginalExStyle = -1;
bool bEnableAntiFlicker = true;

public Form1()
{
    ToggleAntiFlicker(false);
    InitializeComponent();
    this.ResizeBegin += new EventHandler(Form1_ResizeBegin);
    this.ResizeEnd += new EventHandler(Form1_ResizeEnd);
}

protected override CreateParams CreateParams
{
    get
    {
        if (intOriginalExStyle == -1)
        {
            intOriginalExStyle = base.CreateParams.ExStyle;
        }
        CreateParams cp = base.CreateParams;

        if (bEnableAntiFlicker)
        {
            cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED
        }
        else
        {
            cp.ExStyle = intOriginalExStyle;
        }

        return cp;
    }
} 

private void Form1_ResizeBegin(object sender, EventArgs e)
{
    ToggleAntiFlicker(true);
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    ToggleAntiFlicker(false);
}

private void ToggleAntiFlicker(bool Enable)
{
    bEnableAntiFlicker = Enable;
    //hacky, but works
    this.MaximizeBox = true;
}
1 голос
/ 18 сентября 2012

Я обнаружил хитрость в том, чтобы добиться плавного изменения размера и показать линии сетки, а именно добавить дополнительный флаг, если мое приложение работает под Windows XP или Windows Server 2003:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;

        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED  

        if (this.IsXpOr2003 == true)
            cp.ExStyle |= 0x00080000;  // Turn on WS_EX_LAYERED

        return cp;
    }
}

private Boolean IsXpOr2003
{
   get
   {
       OperatingSystem os = Environment.OSVersion;
       Version vs = os.Version;

       if (os.Platform == PlatformID.Win32NT)
           if ((vs.Major == 5) && (vs.Minor != 0))
               return true;
           else
               return false;
       else
           return false;
    }
}
...