DevExpress GridView 鼠标热点追踪 高亮显示行

版本:DevExpress 18.1 for Winform;.NET Framework 4.0。

GridControlUtils工具类的功能:

1,初始化GridView,奇偶行用不同颜色显示。默认,不支持编辑行,仅支持全行单选。

2,自动生成行号。

3,追踪鼠标并高亮显示鼠标所在行。

public static class GridControlUtils
{
    public static readonly Color BackColorOdd = Color.FromArgb(245, 248, 253);
    public static readonly Color BackColorEven = Color.FromArgb(229, 255, 229);
    public static readonly Color BackColorSelected = Color.FromArgb(59, 185, 255);
    public static readonly Color BackColorHover = Color.FromArgb(236, 197, 192);
    public static readonly Color ForeColorDefault = Color.Black;
    public static readonly Color ForeColorSelected = Color.White;

    public static void InitializeGridView(GridView gv)
    {
        gv.OptionsBehavior.AllowAddRows = DefaultBoolean.False;
        gv.OptionsBehavior.AllowDeleteRows = DefaultBoolean.False;
        gv.OptionsBehavior.AutoPopulateColumns = false;
        gv.OptionsBehavior.AutoSelectAllInEditor = false;
        gv.OptionsBehavior.Editable = false;
        gv.OptionsBehavior.ReadOnly = true;

        gv.OptionsCustomization.AllowColumnResizing = false;
        gv.OptionsCustomization.AllowFilter = false;
        gv.OptionsCustomization.AllowGroup = false;
        gv.OptionsCustomization.AllowRowSizing = false;
        gv.OptionsCustomization.AllowSort = false;

        gv.ColumnPanelRowHeight = 28;
        gv.RowHeight = 24;
        gv.IndicatorWidth = 50;
        gv.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
        gv.OptionsView.ColumnHeaderAutoHeight = DefaultBoolean.False;
        gv.OptionsView.EnableAppearanceEvenRow = true;
        gv.OptionsView.EnableAppearanceOddRow = true;
        gv.OptionsView.ShowAutoFilterRow = false;
        gv.OptionsView.RowAutoHeight = false;
        gv.OptionsView.ShowGroupPanel = false;

        gv.Appearance.HeaderPanel.Options.UseTextOptions = true;
        gv.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center;
        gv.Appearance.HeaderPanel.TextOptions.VAlignment = VertAlignment.Center;
        gv.Appearance.HeaderPanel.TextOptions.WordWrap = WordWrap.NoWrap;
        gv.Appearance.Row.TextOptions.HAlignment = HorzAlignment.Near;
        gv.Appearance.Row.TextOptions.VAlignment = VertAlignment.Center;
        gv.Appearance.Row.TextOptions.WordWrap = WordWrap.NoWrap;
        gv.Appearance.OddRow.BackColor = GridControlUtils.BackColorOdd;
        gv.Appearance.OddRow.ForeColor = GridControlUtils.ForeColorDefault;
        gv.Appearance.EvenRow.BackColor = GridControlUtils.BackColorEven;
        gv.Appearance.EvenRow.ForeColor = GridControlUtils.ForeColorDefault;
        gv.Appearance.FocusedRow.BackColor = GridControlUtils.BackColorSelected;
        gv.Appearance.FocusedRow.ForeColor = GridControlUtils.ForeColorSelected;

        gv.OptionsSelection.EnableAppearanceFocusedCell = false;
        gv.OptionsSelection.EnableAppearanceFocusedRow = true;
        gv.OptionsSelection.EnableAppearanceHideSelection = false;
        gv.OptionsSelection.MultiSelect = false;

        gv.CustomDrawRowIndicator += (sender, e) =>
        {
            if (e.RowHandle >= 0)
            {
                var view = sender as GridView;
                e.Info.DisplayText = e.RowHandle + 1 + "";
            }
        };

        gv.RowCountChanged += (sender, e) =>
        {
            gv.InvalidateRows();
        };

        var hottrack = GridControl.InvalidRowHandle;
        gv.MouseMove += (sender, e) =>
        {
            var grid = (GridView)sender;
            var hitInfo = grid.CalcHitInfo(e.Location);
            if (hitInfo.RowHandle != hottrack)
            {
                if (hottrack >= 0)
                {
                    grid.RefreshRow(hottrack);
                }

                hottrack = hitInfo.RowHandle;

                if (hitInfo.InRow)
                {
                    grid.RefreshRow(hottrack);
                }
            }
        };

        gv.RowCellStyle += (sender, e) =>
        {
            var grid = (GridView)sender;
            if (e.RowHandle == hottrack && grid.FocusedRowHandle != hottrack)
            {
                e.Appearance.BackColor = GridControlUtils.BackColorHover;
                e.Appearance.Options.UseBackColor = true;
            }
        };

        //gv.RowStyle += (sender, e) =>
        //{
        //    var grid = (GridView)sender;
        //    if (e.RowHandle == hottrack && grid.FocusedRowHandle != hottrack)
        //    {
        //        e.Appearance.BackColor = GridControlUtils.BackColorHover;
        //        e.HighPriority = true;
        //    }
        //};
    }
}

说明:不建议使用GridView.RowStyle。因为此事件的参数e.Appearance会影响居中显示或居右显示的列。