Just-in-time DataGridView

from the Artful MySQL Tips List


To call the just-in-time grid, the calling control must have instantiated a DgvInfo class containing at least these lookup specs:

  public class DgvInfo {
    public string database;         // home table spec
    public string schema;
    public string table;
    public string key;
    public string order;
    public DgvInfo( string _db, string _schema, string _table, string _key, 
                    string _order ) {
      database = _db;
      schema = _schema;
      table = _table;
      key = _key;
      order = _order;
      parentTables = _parents;
      flags = _flags;
    }
  }

Here is the class that implements the DataGridView running in VirtualMode.


  public class DgvFormJIT : Form  {

    private Form theForm;
    private MySqlConnection conn;
    private Cache memoryCache;
    private const int DEFAULT_PAGE_SIZE = 16;
    private int pageSize = DEFAULT_PAGE_SIZE;
    private DataRetriever dr;
    private DataGridView dgvJIT;
    private string theDatabase, theSchema, theTable, theKey, theValue;
    private string prompt;

    public DgvFormJIT( Form _theForm, MySqlConnection _conn, string _db, 
                       string _schema, string _table, string _key, 
                       string _value, Rectangle _rect ) {
      theForm = _theForm;
      conn = _conn;
      theDatabase = _db;
      theSchema = _schema;
      theTable = _table;
      theKey = _key;
      theValue = _value;
      prompt = "Click to select " + theKey + " from " + theTable + ", or ESC";
      Rectangle theRect = _rect;
      
      // CONFIGURE POPUP FORM
      this.Location = new Point( theRect.Left, theRect.Top );
      this.Height = Math.Min( theRect.Height, SystemInformation.VirtualScreen.Height - theRect.Top - 100 );
      this.Width = theRect.Width;
      this.Text = prompt;
      this.StartPosition = FormStartPosition.Manual;
      this.Anchor = AnchorStyles.None;
      this.AutoSize = true;
      // CONFIGURE DGV
      dgvJIT = new DataGridView();
      dgvJIT.Name = theTable;
      dgvJIT.Tag = new DgvInfo( theDatabase, theSchema, theTable, theKey, theKey );
      dgvJIT.Dock = DockStyle.Fill;
      dgvJIT.ReadOnly = true;
      dgvJIT.AllowUserToAddRows = false;
      dgvJIT.AllowUserToOrderColumns = false;
      dgvJIT.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
      dgvJIT.VirtualMode = true;
      dgvJIT.Top = 0;
      dgvJIT.Left = 0;
      dgvJIT.TabIndex = 1;
      dgvJIT.RowTemplate.Height = 15;
      this.Controls.Add( dgvJIT );
      dgvJIT.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler( this.dgvJIt_CellValueNeeded );
      dgvJIT.CellMouseEnter += new DataGridViewCellEventHandler(dgvJIT_CellMouseEnter);
      dgvJIT.CellMouseLeave += new DataGridViewCellEventHandler( dgvJIT_CellMouseLeave );
      dgvJIT.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler( dgvJIT_ColumnHeaderMouseClick );
      dgvJIT.CellClick +=new DataGridViewCellEventHandler( dgvJIT_CellClick ); 
      dgvJIT.KeyDown += new KeyEventHandler( dgvJIT_KeyDown );
      if ( fillTable() == 0 ) {
        this.Close();
        return;
      }
      int nH = ( 40 + dgvJIT.Rows.Count * 15 < this.Height-20 ? 40 + dgvJIT.Rows.Count * 15 : this.Height-20 );
      dgvJIT.Height = nH;
      this.Height = nH + 30;
      dgvJIT.Show();
      dgvJIT.Enabled = true;
      this.ShowDialog();
    }

    public string SelectedValue {
      get { return theValue; }
    }
    
    private int fillTable() {
      dgvJIT.Columns.Clear();
      dgvJIT.Rows.Clear();
      dgvJIT.EnableHeadersVisualStyles = false; // goofy syntax to permit headerstyle changes
      DataRetriever dr = new DataRetriever( this.conn, theSchema, theTable );
      this.dr = dr;
      memoryCache = new Cache( dr, pageSize );
      foreach ( System.Data.DataColumn column in dr.Columns ) {
        dgvJIT.Columns.Add( column.ColumnName, column.ColumnName );
      }
      if ( dr.RowCount > 0 ) {
        dgvJIT.RowCount = dr.RowCount;
      }
      return dr.RowCount;
    }

    private void refillTable() {
      dgvJIT.Rows.Clear();
      dgvJIT.Columns.Clear();
      memoryCache = null;
      memoryCache = new Cache( this.dr, pageSize );
      foreach ( System.Data.DataColumn column in dr.Columns ) {
        dgvJIT.Columns.Add( column.ColumnName, column.ColumnName );
      }
      dgvJIT.RowCount = dr.RowCount;
      foreach ( DataGridViewColumn col in dgvJIT.Columns ) {
        if ( col.Name == dr.ColumnToSortBy )
          col.HeaderCell.Style.Font = new Font( "Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold,
                                                System.Drawing.GraphicsUnit.Point, ( ( byte ) ( 0 ) ) );
        else
          col.HeaderCell.Style.Font = new Font( "Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular,
                                                System.Drawing.GraphicsUnit.Point, ( ( byte ) ( 0 ) ) );
      }
    }

     private void dgvJIT_ColumnHeaderMouseClick( object sender, DataGridViewCellMouseEventArgs e ) { 
      if( e.ColumnIndex < 0 ) return;
      if ( e.Button == MouseButtons.Right ) {
        DataGridView dgv = ( DataGridView ) sender;
        DgvRowFinder dgvr = new DgvRowFinder( theForm, dgv, e.ColumnIndex, e.RowIndex );
        if ( dgvr.RowFound >= 0 ) {
          dgv.CurrentCell = dgv.Rows[( int ) dgvr.RowFound].Cells[e.ColumnIndex];
          dgv.FirstDisplayedScrollingRowIndex = ( int ) ( long ) dgvr.RowFound;
          dgv.Refresh();
          this.Text = this.prompt;
        }
        else
          this.Text = "No row found where " + dgv.Columns[e.ColumnIndex].Name + "=" + dgvr.UserValue;
      } 
      else {
        string colname = dgvJIT.Columns[e.ColumnIndex].Name;
        dr.ColumnToSortBy = colname;
        refillTable();
      }
    }
    
    private void dgvJIt_CellValueNeeded( object sender, DataGridViewCellValueEventArgs e ) {
      e.Value = memoryCache.RetrieveElement( e.RowIndex, e.ColumnIndex );
    }

    private void dgvJIT_CellClick( object sender, DataGridViewCellEventArgs e ) {
      if ( e.RowIndex < 0 ) return;
      if ( dgvJIT.Columns[e.ColumnIndex].Name != theKey ) return;
      DataGridViewCell cell = ( DataGridViewCell ) dgvJIT.Rows[e.RowIndex].Cells[e.ColumnIndex];
      if ( cell.Value.ToString() == "" ) return;
      this.theValue = cell.Value.ToString();
      this.Close();
    }

    public void dgvJIT_KeyDown( object sender, KeyEventArgs e ) {
      if ( e.KeyCode == Keys.Escape ) {
        this.theValue = "";
        this.Close();
      }
    }

    private void InitializeComponent() {
      this.SuspendLayout();
      // 
      // DgvFormJIT
      // 
      this.ClientSize = new System.Drawing.Size( 292, 273 );
      this.Name = "DgvFormJIT";
      this.ResumeLayout( false );

    }

    private void dgvJIT_CellMouseEnter( object sender, DataGridViewCellEventArgs e ) {
      DataGridView dgv = (DataGridView) sender;
      DgvInfo info = (DgvInfo) dgv.Tag;
      if ( e.ColumnIndex == dgv.Columns[info.key].Index )
        dgv.Cursor = Cursors.Hand;
      else
        dgv.Cursor = Cursors.Default;
    }

    private void dgvJIT_CellMouseLeave( object sender, DataGridViewCellEventArgs e ) {
      DataGridView dgv = ( DataGridView ) sender;
      DgvInfo info = ( DgvInfo ) dgv.Tag;
      if ( e.ColumnIndex == dgv.Columns[info.key].Index )
        dgv.Cursor = Cursors.Default;
    }
}       



Return to the Artful MySQL Tips page