XtraGrid Suite - 有没有办法向单元格添加按钮或超链接?

Posted

技术标签:

【中文标题】XtraGrid Suite - 有没有办法向单元格添加按钮或超链接?【英文标题】:XtraGrid Suite - is there a way to add a button or hyperlink to a cell? 【发布时间】:2011-01-11 02:43:12 【问题描述】:

我正在使用 DevExpress 制作的 XtraGrid Suite。我找不到任何功能来执行此操作,但我很好奇您是否可以向网格单元添加按钮或超链接。

上下文:我有一个事件列表。每个事件都有时间、开始/结束和类别(实用程序和维护)。可以有开始事件和停止事件。完成对问题的分析后,我决定为每个事件设置 StartTime 和 EndTime 是行不通的。

因此,如果一个事件开始,我会将当前时间记录到 Event 对象,并将其设置为“开始”事件。我想在该行的单元格中添加一个“停止”按钮/超链接。如果用户希望记录 Ends 事件,则事件类型等将被复制到类型为“Stop”的新事件中,并且按钮将消失。

我希望这是有道理的。

编辑:Aaronaught 的回答实际上比我最初问的更好(一个按钮),所以我更新了这个问题。这样,任何想要在单元格中放置超链接的人都可以从他的示例中受益:)

【问题讨论】:

【参考方案1】:

我更喜欢通过覆盖绘图代码和处理鼠标移动/单击事件来使用超链接样式的文本,因为按钮不能很好地缩放到网格的典型行高。但是,如果一个按钮确实是您想要的,您应该能够使用 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<T>,可能是某种自定义类型。

MyColors 是一个实用程序类,它定义了几个用于 UI 内容的 public static readonly Color 字段。如果您只打算在一个网格上执行此操作,则可以用硬编码颜色替换对它的引用。

我不会费心缓存Font,虽然你可能可以,因为只有两个。

游标逻辑会与您可能在网格中使用的任何其他游标逻辑相混淆(对我来说几乎在所有情况下都没有,所以通常您应该没问题)。

如果你想拥有多个“链接列”,你需要在hoverRowHandle之外维护一个hoverColumn状态字段,并且显然将那些单列相等比较改为搜索多个列。

对于我自己的 Winforms 应用程序,我实际上有一个 Extender Provider,它允许我通过在列名/链接文本对列表中折腾将此行为附加到 GridViewListView,但该代码只是一点点有点太长了,不能在这里发帖。上面的示例应该可以帮助您入门。

【讨论】:

感谢您的提议,我很想看到超链接的示例。同时,我将使用RepositoryItemButtonEdit 工作。 @calico-cat:如约而至! 非常感谢您为这个答案付出的所有努力。我希望我能多次投票! 旧帖子,但很有用...请注意,要使单击在 xtraGridView 上工作,我必须放置 OptionsBehavior.Editable = False 以避免 gridView 调用就地编辑器并单击网格工作 【参考方案2】:

使用RepositoryItemButtonEdit 并将TextEditStyle 设置为HideTextEditor

【讨论】:

【参考方案3】:

您可以使用 RepositoryItemButtonEdit : 选择您的目标列,在“属性”中单击“ColumnEdit”并选择“新建”,然后选择“ButtonEdit”。单击您的网格并选择“运行设计器”,在“存储库”组上选择“就地编辑器存储库”。选择“repositoryItemButtonEdit1”(如果您没有更改按钮编辑组件名称)选择“事件”选项卡并选择“ButtonPressed”事件。在此事件中填写您的代码。 如果需要,隐藏组件的编辑器部分,选择目标列,在“属性”中单击“ColumnEdit”找到“TextEditStyle”并选择“HideTextEditor”。

但是,有一个问题!?? 我想在按钮中添加图片,有人知道吗?

【讨论】:

我会将此作为一个新问题发布。【参考方案4】:

现在可以使用 RepositoryItemHyperLinkEdit 控件来实现。

见:RepositoryItemHyperLinkEdit Class

【讨论】:

以上是关于XtraGrid Suite - 有没有办法向单元格添加按钮或超链接?的主要内容,如果未能解决你的问题,请参考以下文章

XtraGrid 整行突出显示,除了单击的单元格

XtraGrid 列中的唯一值列表

如何在 DevExpress XtraGrid 中获得单击的单元格列

DevExpress XtraGrid如何使单元格只读?

有没有办法以编程方式向 UICollectionView 单元格添加填充?

有谁用过DevExpress.Xtragrid中的GridControl控件的,麻烦高手们告诉我怎么样做