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

Last updated 22 May 2009


Return to the Artful MySQL Tips page