我正在使用DevExpress制作的XtraGrid套件。我找不到任何类型的功能,但我很好奇你是否可以添加一个按钮或超链接到网格单元格。
上下文:我有一个事件列表。每个事件都有一个时间,开始/结束和一个类别(实用程序和维护)。可以有Start事件和Stop事件。完成对问题的分析后,我决定为每个事件设置StartTime和EndTime都不起作用。
因此,如果事件开始,我会将当前时间记录到Event对象,并将其设置为“Start”事件。我想在该行的单元格中添加一个“停止”按钮/超链接。如果用户希望记录Ends事件,则事件类型等将被复制到类型为“Stop”的新事件,按钮将消失。
我希望这是有道理的。
编辑:Aaronaught的答案实际上比我原来要求的更好(一个按钮)所以我已经更新了问题。这样,任何想要在单元格中放置超链接的人都可以从他的例子中受益:)答案 0 :(得分:15)
我更喜欢通过覆盖绘图代码和处理鼠标移动/单击事件来使用超链接样式文本,因为按钮不能很好地缩放到网格的典型行高。但是,如果按钮确实是您想要的,那么您应该能够使用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
是一个实用工具类,用于定义用于UI内容的几个public static readonly Color
字段。如果您只想在一个网格上执行此操作,则可以使用硬编码颜色替换对该参考的引用。
我不打算缓存Font
,尽管你可能会这样做,因为只有两个。
光标逻辑会混乱你可能在网格中使用的任何其他光标逻辑(几乎在所有情况下对我来说几乎都没有,所以通常你应该没问题。)
如果您想拥有多个“链接列”,除了hoverColumn
之外,还需要维护hoverRowHandle
状态字段,并且显然会更改这些单列相等比较搜索多个列。
对于我自己的Winforms应用程序,我实际上有一个Extender Provider,它允许我通过抛出列名/链接文本对的列表将此行为附加到GridView
或ListView
,但该代码在这里发帖只是一点点太久了。上面的例子可以帮助你开始。
答案 1 :(得分:5)
答案 2 :(得分:1)
您可以使用RepositoryItemButtonEdit: 选择目标列,在“属性”中单击“ColumnEdit”并选择“新建”,然后选择“ButtonEdit”。单击您的网格并选择“运行设计器”,在“存储库”组中选择“就地编辑器存储库”。选择“repositoryItemButtonEdit1”(如果未更改按钮编辑组件名称),选择“事件”选项卡并选择“ButtonPressed”事件。在此活动中填写您的代码。 如果需要,隐藏组件的编辑器部分,选择目标列,在“属性”中单击“ColumnEdit”找到“TextEditStyle”并选择“HideTextEditor”。
但是,有一个问题!?? 我想在我的按钮中添加一张图片,有人有任何想法吗?
答案 3 :(得分:1)
现在可以使用RepositoryItemHyperLinkEdit控件来实现。