我知道如何绘制,实际上我可以绘制(在这种情况下,它实际上看起来像一个添加按钮)。引发的问题是当有足够多的行进入垂直滚动条时,网格没有空间来绘制我的添加按钮。
我已尝试通过将AllowUserToAddRows
设置为true
来解决该问题。这将带来一个新行,它应该给我足够的空间来绘制Add按钮。
但是另一个问题是我需要完全阻止新行的行为(由AllowUserToAddRows
启用),例如默认情况下,当最后一行输入并完成输入时,新行总是被添加并且 将新项目添加到基础绑定数据 。虽然我绘制的添加按钮完全覆盖了新行的外观,但实际上它仍然存在并绑定到基础数据。
这根本不可接受。我试着拦截一些关键的笔画,如TAB,ENTER(在最后一行),但看起来还不够。
因此,要解决我的问题,我们有两种方法:
将AllowUserToAddRows
设置为false
并以某种方式使DataGridView在最后一行的底部给我一个空格(即使有很多行并且出现垂直滚动条)。这样我总是可以预期绘制我的按钮并避免AllowUserToAddRow
的讨厌行为。
将AllowUserToAddRows
设置为true
并以某种方式阻止通过某些标准用户的交互添加新行的默认行为(结束编辑,制表,输入,...) - 实际上我们需要新的行不能通过另一种方式添加,而不是单击Add按钮(我绘制)。
任何方法都没问题(虽然我更喜欢第一种方法,但第二种方法几乎可以使用,但仍然有些错误 - 我真的不相信它的可行性和可靠性。)
这是我的尝试(遵循第二种方法,因为我无法在第一种方法后解决这个问题)。
//override some messages
protected override void WndProc(Message m){
//keydown
if (m.Msg == 0x100){
var vk = m.WParam.ToInt64();
//for the last row
if (CurrentCell.OwningColumn.DisplayIndex == ColumnCount - 1)
{
//intercept the TAB and ENTER
if (vk == 0x9 || vk == 0xd){
return;
}
}
}
}
Winforms的另一个令人烦恼的错误(也许他们称之为功能)。实际上DataGridView
仍然留给我们一个空格(当有很多行时)但是一旦它被添加到一些特殊的布局面板,如GroupBox
,TableLayoutPanel
,..它默认不会共享任何空间。为避免将其置于某些布局面板中有时不容易接受,我们可以自定义一些GroupBox(使用普通面板),但我们无法轻松自定义TableLayoutPanel
。我认为这可以采用另一种方法(第三种方法)。