当前位置:  开发笔记 > 小程序 > 正文

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

如何解决《XtraGridSuite-有没有办法向单元格添加按钮或超链接?》经验,为你挑选了2个好方法。

我正在使用DevExpress制作的XtraGrid套件.我找不到任何类型的功能,但我很好奇你是否可以添加按钮或超链接到网格单元格.

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

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

我希望这是有道理的.

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



1> 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应用程序,我实际上有一个扩展程序提供程序,它允许我将此行为附加到GridViewListView通过抛出列名称/链接文本对列表,但该代码只是在这里发布的时间太长了.上面的例子可以帮助你入门.


非常感谢你为这个答案付出的所有努力.我希望我能不止一次地投票!

2> Pierre-Alain..:

使用RepositoryItemButtonEdit和设置TextEditStyleHideTextEditor.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有