DataGridView рисует неправильно

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

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;
    }
} 

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


person Murat    schedule 02.05.2011    source источник


Ответы (2)


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

Вот обходной путь, чтобы остановить мерцание, когда пользователь изменяет размер формы, но не портя отрисовку элементов управления, таких как 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;
}
person John Suit    schedule 28.06.2011

Я обнаружил, что трюк с плавным изменением размера и отображением линий сетки заключается в добавлении дополнительного флага, если мое приложение работает под 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;
    }
}
person Web Houlgrave    schedule 17.09.2012