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