using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using UltraWinGrid = Infragistics.Win.UltraWinGrid; using Infragistics.Win.UltraWinEditors; using Infragistics.Win.UltraWinGrid; namespace GridTabIssue { public partial class Form1 : Form { private bool m_addNewRowOnNextCellByTab; public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { myGrid.DisplayLayout.Override.HeaderClickAction = Infragistics.Win.UltraWinGrid.HeaderClickAction.SortMulti; myGrid.DisplayLayout.Override.CellClickAction = Infragistics.Win.UltraWinGrid.CellClickAction.EditAndSelectText; myGrid.DisplayLayout.Override.AllowAddNew = Infragistics.Win.UltraWinGrid.AllowAddNew.TabRepeat; myGrid.DisplayLayout.Override.AllowRowFiltering = Infragistics.Win.DefaultableBoolean.False; myGrid.DisplayLayout.Override.RowSelectors = Infragistics.Win.DefaultableBoolean.True; myGrid.DisplayLayout.Override.SelectTypeRow = UltraWinGrid.SelectType.None; myGrid.DisplayLayout.Override.SelectTypeCell = UltraWinGrid.SelectType.Single; myGrid.DisplayLayout.GroupByBox.Hidden = true; myGrid.InitializeLayout += new Infragistics.Win.UltraWinGrid.InitializeLayoutEventHandler(myGrid_InitializeLayout); myGrid.PreviewKeyDown += new PreviewKeyDownEventHandler(myGrid_PreviewKeyDown); myGrid.KeyDown += new KeyEventHandler(myGrid_KeyDown); myGrid.CellDataError += new CellDataErrorEventHandler(myGrid_CellDataError); myGrid.BeforeExitEditMode += new BeforeExitEditModeEventHandler(myGrid_BeforeExitEditMode); myGrid.ControlAdded += new ControlEventHandler(myGrid_ControlAdded); myGrid.ControlRemoved += new ControlEventHandler(myGrid_ControlRemoved); LoadData(5); } private void LoadData(Int32 nbOfRecords) { DataTable table = new DataTable(); table.Columns.Add("INT", typeof(int)); table.Columns.Add("BOOL", typeof(bool)); table.Columns.Add("STRING", typeof(string)); table.Columns.Add("DATE", typeof(DateTime)); table.Columns.Add("DOUBLE", typeof(double)); for (int i = 0; i < nbOfRecords; i++) { DataRow row = table.NewRow(); row["INT"] = i; row["STRING"] = "123456789123456789" + i.ToString(); row["DATE"] = DateTime.Now.AddHours(i * 17); row["DOUBLE"] = Convert.ToDouble(i) + 0.345d; if (i.ToString().EndsWith("0")) { row["BOOL"] = 0; } else if (i.ToString().EndsWith("1")) { row["BOOL"] = 0; } else { row["BOOL"] = 1; } table.Rows.Add(row); } myGrid.DataSource = table; } void myGrid_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e) { //visible foreach (UltraWinGrid.UltraGridColumn column in e.Layout.Bands[0].Columns) { column.Hidden = true; column.CellActivation = UltraWinGrid.Activation.AllowEdit; column.TabStop = true; } UltraWinGrid.UltraGridColumn oneColumn; oneColumn = e.Layout.Bands[0].Columns["INT"]; oneColumn.Hidden = false; oneColumn.Header.VisiblePosition = 0; oneColumn.Header.Caption = "Integer"; oneColumn.Format = "G"; oneColumn = e.Layout.Bands[0].Columns["BOOL"]; oneColumn.Hidden = false; oneColumn.Header.VisiblePosition = 1; oneColumn.Header.Caption = "Boolean"; oneColumn = e.Layout.Bands[0].Columns["STRING"]; oneColumn.Hidden = false; oneColumn.Header.VisiblePosition = 2; oneColumn.Header.Caption = "String"; oneColumn = e.Layout.Bands[0].Columns["DATE"]; oneColumn.Hidden = false; oneColumn.Header.VisiblePosition = 3; oneColumn.Header.Caption = "Date"; oneColumn = e.Layout.Bands[0].Columns["DOUBLE"]; oneColumn.Hidden = false; oneColumn.Header.VisiblePosition = 4; oneColumn.Header.Caption = "Double"; } void myGrid_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { m_addNewRowOnNextCellByTab = false; if ((e.KeyValue == 9) && (myGrid.ActiveCell != null && myGrid.ActiveCell.Row.Index == (myGrid.Rows.Count - 1) && myGrid.ActiveCell.Column.Key.CompareTo("DOUBLE") == 0)) { m_addNewRowOnNextCellByTab = true; } } void myGrid_KeyDown(object sender, KeyEventArgs e) { try { myGrid.BeginUpdate(); if (e.KeyData == Keys.Enter) { if (myGrid.PerformAction(UltraWinGrid.UltraGridAction.ExitEditMode)) { //only proceed if the cell has actually managed to exit edit mode //(i.e. there are no input errors) if (!myGrid.ActiveCell.IsInEditMode) { myGrid.PerformAction(UltraWinGrid.UltraGridAction.ToggleCellSel); myGrid.PerformAction(UltraWinGrid.UltraGridAction.BelowCell); } } e.Handled = true; } else if (e.KeyData == Keys.Tab) { //tab should exit edit mode and move to the next editable cell if (m_addNewRowOnNextCellByTab) { // exit edit mode first myGrid.PerformAction(UltraWinGrid.UltraGridAction.ExitEditMode); if (!myGrid.ActiveCell.IsInEditMode) { // add new row. UltraWinGrid.UltraGridRow newRow = myGrid.DisplayLayout.Bands[0].AddNew(); if (newRow != null) { myGrid.ActiveCell = newRow.Cells[0]; myGrid.Focus(); myGrid.PerformAction(UltraWinGrid.UltraGridAction.EnterEditMode); } } } else myGrid.PerformAction(UltraWinGrid.UltraGridAction.NextCellByTab); m_addNewRowOnNextCellByTab = false; e.Handled = true; } } finally { myGrid.EndUpdate(); } this.OnKeyDown(e); } void myGrid_CellDataError(object sender, CellDataErrorEventArgs e) { DialogResult dlgResult = MessageBox.Show("error", "error", MessageBoxButtons.RetryCancel); if (dlgResult == System.Windows.Forms.DialogResult.Cancel) { //cancel, get out e.StayInEditMode = false; e.RestoreOriginalValue = true; } else e.StayInEditMode = true; e.RaiseErrorEvent = false; } void myGrid_ControlAdded(object sender, ControlEventArgs e) { UltraGrid gridEditor = sender as UltraGrid; if (gridEditor != null) { TextBox textBox = gridEditor.Controls[0] as TextBox; if (textBox != null) textBox.PreviewKeyDown += new PreviewKeyDownEventHandler(myGrid_PreviewKeyDown); } } void myGrid_ControlRemoved(object sender, ControlEventArgs e) { UltraGrid gridEditor = sender as UltraGrid; if (gridEditor != null) { TextBox textBox = gridEditor.Controls[0] as TextBox; if (textBox != null) textBox.PreviewKeyDown -= new PreviewKeyDownEventHandler(myGrid_PreviewKeyDown); } } void myGrid_BeforeExitEditMode(object sender, BeforeExitEditModeEventArgs e) { if (myGrid.ActiveCell != null && !e.CancellingEditOperation) { int index = 0; } } } }