SSMS
 sql >> Base de données >  >> Database Tools >> SSMS

Contrôle de grille dans SSMS

La grille SSMS n'est pas C++, ce n'est pas une ListView ni une DataGrid, elle n'utilise pas les contrôles natifs de Windows, c'est "juste" un contrôle .NET personnalisé nommé GridControl (dans un Microsoft.SqlServer.Management.UI.Grid namespace) qui appartient à un assembly nommé Microsoft.SqlServer.GridControl.dll.

Vous pouvez le trouver à différents endroits :dans le GAC , dans %ProgramFiles(x86)%\Common Files\Microsoft Shared\SQL Server Developer Tools , dans %ProgramFiles(x86)%\Microsoft SQL Server Management Studio 18\Common7\IDE , dans les fichiers Visual Studio, etc.

Ce n'est pas un AFAIK binaire redistribuable, donc vous n'êtes pas censé l'expédier, ce n'est pas documenté, et ce n'est pas une grille complète comme les autres. Cependant, comme vous l'avez découvert, il est léger et peut être rapide, aussi rapide que votre accès aux données sous-jacentes.

Si vous voulez jouer avec, voici un petit exemple Winforms C# (une grille de 10000 x 256, soit 2,5 millions de cellules qui s'ouvre instantanément) qui montre comment l'utiliser :

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();
    }
}

Voici à quoi cela ressemble. Vous pouvez faire défiler sans aucun ralentissement, sur un ordinateur décent.