Всем привет в общем переопределил класс столбца у DataGridView
| Код | public class SDataGridComboBoxColumn : DataGridTextBoxColumn { public NoKeyUpCombo ColumnComboBox; private System.Windows.Forms.CurrencyManager _source; private int _rowNum; private bool _isEditing; public static int _RowCount;
public SDataGridComboBoxColumn() : base() { _source = null; _isEditing = false; _RowCount = -1;
ColumnComboBox = new NoKeyUpCombo(); ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
ColumnComboBox.Leave += new EventHandler(LeaveComboBox); // ColumnComboBox.Enter += new EventHandler(ComboMadeCurrent); ColumnComboBox.SelectionChangeCommitted += new EventHandler(ComboStartEditing);
} private void ComboStartEditing(object sender, EventArgs e) { _isEditing = true; base.ColumnStartedEditing((Control)sender); }
private void HandleScroll(object sender, EventArgs e) { if (ColumnComboBox.Visible) ColumnComboBox.Hide();
}
private void LeaveComboBox(object sender, EventArgs e) { if (_isEditing) { SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text); _isEditing = false; Invalidate(); } ColumnComboBox.Hide(); this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(HandleScroll);
}
protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) {
base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible);
_rowNum = rowNum; _source = source;
ColumnComboBox.Parent = this.TextBox.Parent; ColumnComboBox.Location = this.TextBox.Location; ColumnComboBox.Size = new System.Drawing.Size(this.TextBox.Size.Width, ColumnComboBox.Size.Height); ColumnComboBox.SelectedIndex = ColumnComboBox.FindStringExact(this.TextBox.Text); ColumnComboBox.Text = this.TextBox.Text; this.TextBox.Visible = false; ColumnComboBox.Visible = true; this.DataGridTableStyle.DataGrid.Scroll += new EventHandler(HandleScroll);
ColumnComboBox.BringToFront(); ColumnComboBox.Focus(); }
protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum) { if (_isEditing) { _isEditing = false; SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text); } return true; }
protected override void ConcedeFocus() { Console.WriteLine("ConcedeFocus"); base.ConcedeFocus(); }
protected override object GetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, int rowNum) {
object s = base.GetColumnValueAtRow(source, rowNum); System.Data.DataView dv = (System.Data.DataView)this.ColumnComboBox.DataSource; int rowCount = dv.Count; int i = 0; while (i < rowCount) { if (s.Equals(dv[i][this.ColumnComboBox.ValueMember])) break; ++i; }
if (i < rowCount) return dv[i][this.ColumnComboBox.DisplayMember];
return DBNull.Value; }
protected override void SetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, int rowNum, object value) { object s = value;
System.Data.DataView dv = (System.Data.DataView)this.ColumnComboBox.DataSource; int rowCount = dv.Count; int i = 0; while (i < rowCount) { if (s.Equals(dv[i][this.ColumnComboBox.DisplayMember])) break; ++i; } if (i < rowCount) s = dv[i][this.ColumnComboBox.ValueMember]; else s = DBNull.Value; base.SetColumnValueAtRow(source, rowNum, s);
} }
|
На форме имеется компонент DataGridView, но никак не могу сообразить как переопределить один из имеющихся столбцов c этим классом. |