首先,我很抱歉我的示例是用C#编写的,请使用Telerik的转换器将代码转换为VB.NET。
最近,我一直在处理这个问题。我研究和记录了整个框架,只是想看看是否有实现它的好方法,但没有找到。
当我看到你的问题时,我决定花一个小时,专注地挖掘一些更多的东西,并发现了一种非常混乱的方法来实现它,这比我一直在使用的另一种混乱的方法更加混乱。对于感兴趣的程序员,到目前为止,我所做的事情是通过反射或继承激活Double Buffering到DataGridView控件中,与WS_EX_COMPOSITED激活混合。
它的工作原理如下:
public class DataGridViewV2 : DataGridView
{
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x02000000;
return cp;
}
}
public DataGridViewV2()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
}
}
这大大减少了垂直分隔线的显示。在大多数情况下,除非它影响了你的设计不一致性或者你是一个完美主义者,否则它已经足够了。
好的,现在我们来介绍我刚发现的当前方法:
这个 是主要绘制我们的丑陋问题的方法,它是私有的,我们无法操纵它的功能。我已经跳来跳去找到了它依赖于一个叫做
currentColSplitBar 的私有变量,它决定了是否绘制它。中奖了!我们只需要使用反射,将变量编辑为始终保持-1的值,以对抗从
PaintGrid方法绘制它的条件,它就永远不会出现了。
当我们点击单元格可调整的分隔符时,拆分器的绘制开始并持续到我们释放点击,因此自然而然地,我们希望在MouseDown事件和MouseMove事件中编辑变量。因此,我们只需重用先前的方法,并将新处理程序分配给这些事件。
public class DataGridViewV2 : DataGridView
{
public DataGridViewV2()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
MouseDown += (sender, e) => PreventXOR_Region();
MouseMove += (sender, e) => PreventXOR_Region();
}
private void PreventXOR_Region()
{
FieldInfo field = typeof(DataGridView).GetField("currentColSplitBar", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(this, -1);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x02000000;
return cp;
}
}
}
混乱,但它可以工作!