c# - 在 DataGridView 的最后一行底部画一些东西?
问题描述
我知道如何绘制,实际上我可以绘制(在这种情况下,它实际上看起来像一个添加按钮)。提出的问题是当有足够多的行可以容纳垂直滚动条时,网格没有空间来绘制我的添加按钮。
我尝试通过设置AllowUserToAddRows
为来解决该问题true
。这将带来一个新行,应该给我足够的空间来绘制添加按钮。
但是发生的另一个问题是我需要完全阻止新行(由启用AllowUserToAddRows
)的行为,例如默认情况下,当最后一行输入并完成输入时,总是添加新行并向底层添加新项目绑定数据。尽管我绘制的添加按钮完全覆盖了新行的外观,但实际上它仍然存在并绑定到基础数据。
这真的是完全不能接受的。我会尝试截取一些击键,例如 TAB、ENTER(在最后一行),但看起来这还不够。
所以为了解决我的问题,我们有两种方法:
设置
AllowUserToAddRows
为false
并以某种方式使 DataGridView 在最后一行的底部给我一个空间(即使有很多行并且出现垂直滚动条)。这样我总是可以按预期绘制我的按钮并避免AllowUserToAddRow
.设置并
AllowUserToAddRows
以true
某种方式阻止通过某些标准用户的交互(结束编辑、制表符、输入...)添加新行的默认行为 - 实际上我们需要除了单击添加之外不能通过其他方式添加新行按钮(我画的)。
任何方法都可以(虽然我更喜欢第一种,但第二种可能几乎可以工作,但仍然有问题——我真的不相信它的可行性和可靠性)。
这是我的尝试(按照第二种方法,因为我不知道按照第一种方法解决这个问题)。
//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
. 我认为这开启了另一种方法(第三种方法)。
解决方案
推荐阅读
- r - 字体不是粗体
- java - Java MessageFormat 和 LocalDate
- javascript - ReactJs carousel - 如何在滑动后强制项目捕捉?
- r - 为数据框中的所有行计算 R 中的测地线距离
- amazon-web-services - 了解路由表
- javascript - 如何折叠和展开角度?
- npm - 在树中安装不同版本的 npm 包
- azure - 我们能否横向扩展托管在 Azure 存储中的静态网站?
- c# - 如何从 ContentControl 的 Range.WordOpenXML 的存储值而不是其语法值中获取纯超链接文本?
- javascript - 如何更改在另一个功能中关闭的滑块的图像?