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;
}
}
Мерцание исчезло, но мое представление данных отображается неправильно. Это показывает CellBorders, BorderColors неправильно. На самом деле этот код имеет некоторые проблемы с фоновыми изображениями, линиями и прочим. Почему это и как это можно исправить?
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;
}
Я обнаружил хитрость в том, чтобы иметь хорошее плавное изменение размера и показать мои линии сетки, а именно добавить дополнительный флаг, если мое приложение работает под 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;
}
}