Grid control in SSMS

前端 未结 1 1747
粉色の甜心
粉色の甜心 2021-02-13 10:49

I notice in SSMS (SQL Server Management Studio 2016), the query results return within a blink of a second (above 10k+ rows). The result table/grid scroll perfec

1条回答
  •  离开以前
    2021-02-13 11:14

    SSMS grid is not C++, it's not a ListView nor a DataGrid, it does not uses Windows native controls, it's "just" a custom .NET control named GridControl (in a Microsoft.SqlServer.Management.UI.Grid namespace) that belongs to an assembly named Microsoft.SqlServer.GridControl.dll.

    You can find it in various places: in the GAC, in %ProgramFiles(x86)%\Common Files\Microsoft Shared\SQL Server Developer Tools, in Visual Studio files, etc.

    It's not a redistributable binary AFAIK, so you're not supposed to ship it, it's not documented, and it's not a full-featured grid like others. However, as you found out, it's lightweight and it can be fast, as fast as your underlying data access.

    If you want to play with it, here's a small Winforms C# sample (a 10000 x 256 grid, which is 2,5 million cells that opens instantly) that demonstrates how to use it:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using Microsoft.SqlServer.Management.UI.Grid;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            private GridControl _control = new GridControl();
    
            public Form1()
            {
                InitializeComponent();
    
                for (int i = 0; i < 256; i++)
                {
                    _control.AddColumn(new GridColumnInfo { HeaderType = GridColumnHeaderType.Text, IsUserResizable = true });
                    _control.SetHeaderInfo(i, "Column " + i, null);
                }
    
                _control.Dock = DockStyle.Fill;
                _control.GridStorage = new GridStorage();
                Controls.Add(_control);
            }
        }
    
        // represents a datasource
        public class GridStorage : IGridStorage
        {
            public long EnsureRowsInBuf(long FirstRowIndex, long LastRowIndex)
            {
                return NumRows(); // pagination, dynamic load, virtualization, could happen here
            }
    
            public void FillControlWithData(long nRowIndex, int nColIndex, IGridEmbeddedControl control)
            {
                // for cell edition
                control.SetCurSelectionAsString(GetCellDataAsString(nRowIndex, nColIndex));
            }
    
            public string GetCellDataAsString(long nRowIndex, int nColIndex)
            {
                // get cell data
                return nRowIndex + " x " + nColIndex;
            }
    
            public int IsCellEditable(long nRowIndex, int nColIndex)
            {
                return 1; // 1 means yes, 0 means false
            }
    
            public long NumRows()
            {
                return 10000;
            }
    
            public bool SetCellDataFromControl(long nRowIndex, int nColIndex, IGridEmbeddedControl control)
            {
                // when a cell has changed, you're supposed to change your data here
                return true;
            }
    
            public Bitmap GetCellDataAsBitmap(long nRowIndex, int nColIndex) => throw new NotImplementedException();
            public void GetCellDataForButton(long nRowIndex, int nColIndex, out ButtonCellState state, out Bitmap image, out string buttonLabel) => throw new NotImplementedException();
            public GridCheckBoxState GetCellDataForCheckBox(long nRowIndex, int nColIndex) => throw new NotImplementedException();
        }
    }
    

    Here is what it looks like. You can scroll without any slowdown, on a decent computer.

    0 讨论(0)
提交回复
热议问题