我正在使用DevExpress制作的XtraGrid套件.我找不到任何类型的功能,但我很好奇你是否可以添加按钮或超链接到网格单元格.
上下文:我有一个事件列表.每个事件都有一个时间,开始/结束和一个类别(实用程序和维护).可以有Start事件和Stop事件.完成了对问题的分析后,我决定为每个事件设置一个StartTime和EndTime是行不通的.
因此,如果事件开始,我会将当前时间记录到Event对象,并将其设置为"Start"事件.我想在该行的单元格中添加一个"停止"按钮/超链接.如果用户希望记录Ends事件,则事件类型等将被复制到类型为"Stop"的新事件,按钮将消失.
我希望这是有道理的.
编辑:Aaronaught的回答实际上比我原来要求的更好(一个按钮)所以我已经更新了这个问题.这样,任何想要在单元格中放置超链接的人都可以从他的例子中受益:)
我更喜欢通过覆盖绘图代码和处理鼠标移动/单击事件来使用超链接样式的文本,因为按钮不能很好地缩放到网格的典型行高.但是,如果按钮确实是您想要的,您应该可以使用RepositoryItemButtonEdit
编辑器类型来执行此操作.
如果你对前者感兴趣,请留下评论,我会用一个例子来更新.否则,如上所述,只需使用RepositoryItemButtonEdit
.如果需要,可以更改其属性以占据整个单元格,然后将列设置为固定大小,以使按钮不会拉伸.
更新:我正在为下面的"漂亮的超链接"发布一些示例代码,我比标准的超链接单元更好,因为(a)它看起来更好,(b)它提供悬停反馈,(c)你可以如果你愿意,可以更改光标(我使用实用程序方法从操作系统获取本机手形光标,它比Winforms的内置手具有更多3D外观).
注意非DevExpress用户阅读: 我使用几乎相同的技术标准System.Windows.Forms.ListView
.Microsoft在Vista和Windows 7中使用了这种UI模式,即使结果不是完美的副本,也可以学习如何操作.
private int hoverRowHandle = GridControl.InvalidRowHandle; private void gridView_Click(object sender, EventArgs e) { if (hoverRowHandle != GridControl.InvalidRowHandle) { MyItem item = gridView.GetRow(hoverRowHandle) as MyItem; if (item != null) // Do whatever the "click" action is here } } private void gridView_CustomDrawCell(object sender, RowCellCustomDrawEventArgs e) { if (e.Column == linkColumn) { bool hover = (hoverRowHandle == e.RowHandle); FontStyle style = hover ? FontStyle.Underline : FontStyle.Regular; TextFormatFlags formatFlags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.WordEllipsis; Color foreColor = gridView.IsRowSelected(e.RowHandle) ? Color.White : (hover ? MyColors.LinkHover : MyColors.Link); using (Font font = new Font(gridControl.Font, style)) { TextRenderer.DrawText(e.Graphics, "Link Text", font, e.Bounds, foreColor, formatFlags); } e.Handled = true; } } private void gridView_MouseLeave(object sender, EventArgs e) { int tempRowHandle = hoverRowHandle; hoverRowHandle = GridControl.InvalidRowHandle; if (tempRowHandle != GridControl.InvalidRowHandle) { gridView.InvalidateRowCell(tempRowHandle, linkColumn); } } private void gridView_MouseMove(object sender, MouseEventArgs e) { int tempRowHandle = hoverRowHandle; if (tempRowHandle != GridControl.InvalidRowHandle) { hoverRowHandle = GridControl.InvalidRowHandle; gridView.InvalidateRowCell(tempRowHandle, linkColumn); } GridHitInfo hitInfo = gridView.CalcHitInfo(e.Location); if (hitInfo.InRowCell && (hitInfo.Column == linkColumn)) { hoverRowHandle = hitInfo.RowHandle; gridView.InvalidateRowCell(hoverRowHandle, linkColumn); } bool hoverDetail = (hoverRowHandle != GridControl.InvalidRowHandle); gridControl.Cursor = hoverDetail ? Cursors.Hand : Cursors.Default; }
关于此代码的一些注意事项:
MyItem
是您绑定到网格视图的任何类型的数据.也许它是一个DataRow
,或者如果数据源是一个自定义类型IList
.
MyColors
是一个实用程序类,它定义了一些public static readonly Color
用于UI内容的字段.如果您只想在一个网格上执行此操作,则可以使用硬编码颜色替换对其的引用.
我不打扰缓存Font
,虽然你可能可以,因为它们只有两个.
游标逻辑会混乱您可能在网格中使用的任何其他游标逻辑(几乎在所有情况下几乎都没有,所以通常你应该没问题).
如果您想拥有多个"链接列",则需要维护一个hoverColumn
状态字段hoverRowHandle
,并且显然需要更改这些单列相等比较以搜索多个列.
对于我自己的Winforms应用程序,我实际上有一个扩展程序提供程序,它允许我将此行为附加到GridView
或ListView
通过抛出列名称/链接文本对列表,但该代码只是在这里发布的时间太长了.上面的例子可以帮助你入门.
使用RepositoryItemButtonEdit
和设置TextEditStyle
为HideTextEditor
.