Skip to main content

DevExpress v24.2 Update — Your Feedback Matters

Our What's New in v24.2 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

How to: Display Some Text When No Record is Displayed in the Grid

  • 3 minutes to read

The code below employs the ColumnView.CustomDrawEmptyForeground event to draw a custom string within the Data Grid control area when the Grid has no records to display. Clicking the “Try Searching Again” link displays a dialog that allows end-users to modify the currently applied filter.

GridControl - CustomDrawEmptyFore

private void Form3_Load1(object sender, EventArgs e) {
    CustomDrawEmptyForeground(gridControl1, gridView1);
}

public static void CustomDrawEmptyForeground(GridControl gridControl, GridView gridView) {
    string searchName = string.Empty;
    gridView.ActiveFilterCriteria = new BinaryOperator("Category_Name", searchName);

    // Initialize variables used to paint View's empty space in a custom manner
    Font noMatchesFoundTextFont = new Font("Tahoma", 10);
    Font trySearchingAgainTextFont = new Font("Tahoma", 15, FontStyle.Underline);
    Font trySearchingAgainTextFontBold = new Font(trySearchingAgainTextFont, FontStyle.Underline | FontStyle.Bold);
    SolidBrush linkBrush = new SolidBrush(DevExpress.Skins.EditorsSkins.GetSkin(DevExpress.LookAndFeel.UserLookAndFeel.Default.ActiveLookAndFeel).Colors["HyperLinkTextColor"]);
    string noMatchesFoundText = "No matches found";
    string trySearchingAgainText = "Try searching again";
    Rectangle noMatchesFoundBounds = Rectangle.Empty;
    Rectangle trySearchingAgainBounds = Rectangle.Empty;
    bool trySearchingAgainBoundsContainCursor = false;
    int offset = 10;

    //Handle this event to paint View's empty space in a custom manner
    gridView.CustomDrawEmptyForeground += (s, e) => {
        e.DefaultDraw();
        e.Appearance.Options.UseFont = true;
        e.Appearance.Font = noMatchesFoundTextFont;
        //Draw the noMatchesFoundText string
        Size size = e.Appearance.CalcTextSize(e.Cache, noMatchesFoundText, e.Bounds.Width).ToSize();
        int x = (e.Bounds.Width - size.Width) / 2;
        int y = e.Bounds.Y + offset;
        noMatchesFoundBounds = new Rectangle(new Point(x, y), size);
        e.Appearance.DrawString(e.Cache, noMatchesFoundText, noMatchesFoundBounds);
        //Draw the trySearchingAgain link
        e.Appearance.Font = trySearchingAgainBoundsContainCursor ? trySearchingAgainTextFontBold : trySearchingAgainTextFont;
        size = e.Appearance.CalcTextSize(e.Cache, trySearchingAgainText, e.Bounds.Width).ToSize();
        x = noMatchesFoundBounds.X - (size.Width - noMatchesFoundBounds.Width) / 2;
        y = noMatchesFoundBounds.Bottom + offset;
        size.Width += offset;
        trySearchingAgainBounds = new Rectangle(new Point(x, y), size);
        e.Appearance.DrawString(e.Cache, trySearchingAgainText, trySearchingAgainBounds, linkBrush);
    };

    gridView.MouseMove += (s, e) => {
        trySearchingAgainBoundsContainCursor = trySearchingAgainBounds.Contains(e.Location);
        gridControl.Cursor = trySearchingAgainBoundsContainCursor ? Cursors.Hand : Cursors.Default;
        gridView.InvalidateRect(trySearchingAgainBounds);
    };

    gridView.MouseDown += (s, e) => {
        if (trySearchingAgainBoundsContainCursor) {
            searchName = XtraInputBox.Show(string.Format("Enter {0}", "Name"), string.Format("Enter {0} dialog", "Name"), searchName);
            gridView.ActiveFilterCriteria = new DevExpress.Data.Filtering.BinaryOperator("Category_Name", searchName);
        }
    };
}