我更喜欢通过覆盖绘图代码和处理鼠标移动/单击事件来使用超链接样式的文本,因为按钮不能很好地缩放到网格的典型行高。然而,如果一个按钮真的是你想要的,你应该能够使用RepositoryItemButtonEdit
作为编辑器类型来做到这一点。
如果您对前者感兴趣,请发表评论,我将通过示例对其进行更新。否则,如前所述,只需使用RepositoryItemButtonEdit
. 如果需要,您可以更改其属性以占据整个单元格,然后将列设置为固定大小,这样按钮就不会被拉伸。
更新:我正在为下面的“漂亮的超链接”发布一些示例代码,我比标准的超链接单元更喜欢它,因为(a)它看起来更好,(b)它提供悬停反馈,以及(c)你可以如果需要,可以更改光标(我使用实用程序方法从操作系统获取本机手形光标,它比 Winforms 的内置手形具有更多的 3D 外观)。
阅读本文的非 DevExpress 用户请注意: 我对标准System.Windows.Forms.ListView
. 微软在 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<T>
.
MyColors
是一个实用程序类,它定义了几个public static readonly Color
用于 UI 内容的字段。如果您只打算在一个网格上执行此操作,则可以用硬编码颜色替换对它的引用。
我不费心缓存Font
,尽管您可能可以,因为它们只有两个。
游标逻辑会与您可能在网格中使用的任何其他游标逻辑混淆(对我来说几乎在每种情况下都没有,所以通常你应该没问题)。
如果要拥有多个“链接列”,则需要hoverColumn
在 之外维护一个状态字段hoverRowHandle
,并且显然将那些单列相等比较更改为搜索多个列。
对于我自己的 Winforms 应用程序,我实际上有一个 Extender Provider,它允许我将此行为附加到 aGridView
或ListView
通过折腾列名称/链接文本对的列表,但该代码有点太长,无法在此处发布。上面的示例应该可以帮助您入门。