在DataGridView的最后一行底部绘制一些东西?

时间:2018-06-07 05:28:22

标签: c# winforms datagridview custom-controls customization

我知道如何绘制,实际上我可以绘制(在这种情况下,它实际上看起来像一个添加按钮)。引发的问题是当有足够多的行进入垂直滚动条时,网格没有空间来绘制我的添加按钮。

我已尝试通过将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仍然留给我们一个空格(当有很多行时)但是一旦它被添加到一些特殊的布局面板,如GroupBoxTableLayoutPanel,..它默认不会共享任何空间。为避免将其置于某些布局面板中有时不容易接受,我们可以自定义一些GroupBox(使用普通面板),但我们无法轻松自定义TableLayoutPanel。我认为这可以采用另一种方法(第三种方法)。

0 个答案:

没有答案