/// <summary> /// Columns generator that works on column data descriptions (ColumnDataDescriptor) /// </summary> /// <param name="dataGrid">DataGridView</param> /// <param name="DataSource">Data Source to support data-binding</param> /// <param name="Columns">Column data descriptors</param> public static void GenerateColumns(this DataGridView dataGrid, object DataSource, params ColumnDataDescriptor[] Columns) { dataGrid.SuspendLayout(); dataGrid.AutoGenerateColumns = false; dataGrid.Columns.Clear(); foreach (var column in Columns) { if (column.Mode == ColumnEditorMode.TextBox) { var newColumn = new DataGridViewTextBoxColumn(); column.GeneratedDataGridViewColumn = newColumn; newColumn.SortMode = DataGridViewColumnSortMode.Automatic; newColumn.HeaderText = column.HeaderText; if (column.MaxLength.HasValue) { newColumn.MaxInputLength = column.MaxLength.Value; } if (newColumn.MaxInputLength > 260) { newColumn.DefaultCellStyle = new DataGridViewCellStyle() { WrapMode = DataGridViewTriState.True } } ; if (column.FillWeight.HasValue) { newColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; newColumn.FillWeight = column.FillWeight.Value; newColumn.MinimumWidth = column.HeaderText.Length * 10; if (newColumn.MinimumWidth < 50) { newColumn.MinimumWidth = 50; } } newColumn.ToolTipText = column.ColumnName; newColumn.DataPropertyName = column.ColumnName; if (column.NullValue != null) { if (newColumn.DefaultCellStyle != null) { newColumn.DefaultCellStyle.NullValue = column.NullValue; } else { newColumn.DefaultCellStyle = new DataGridViewCellStyle() { NullValue = column.NullValue } }; } newColumn.ReadOnly = column.IsReadOnly; if (column.Style.HasValue) { DataGridViewExtenders.SetEditorDataStyle(newColumn, column.Style.Value); } dataGrid.Columns.Add(newColumn); if (column.FormatValueMethod != null) { newColumn.Tag = column.FormatValueMethod; dataGrid.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e) { var _data = newColumn.Tag as FormatValueDelegate; if (_data != null && e.ColumnIndex == newColumn.Index && e.RowIndex >= 0) { var _value = _data.Invoke(dataGrid.Rows[e.RowIndex].DataBoundItem, newColumn.DataPropertyName); if (_value != null) { e.Value = _value; e.FormattingApplied = _value is string; } } }; } } else if (column.Mode == ColumnEditorMode.CheckBox) { var newColumn = new DataGridViewCheckBoxColumn(); column.GeneratedDataGridViewColumn = newColumn; newColumn.SortMode = DataGridViewColumnSortMode.Automatic; newColumn.HeaderText = column.HeaderText; if (column.FillWeight.HasValue) { newColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; newColumn.FillWeight = column.FillWeight.Value; newColumn.MinimumWidth = column.HeaderText.Length * 10; if (newColumn.MinimumWidth < 50) { newColumn.MinimumWidth = 50; } } newColumn.ToolTipText = column.ColumnName; newColumn.ThreeState = column.IsNull; newColumn.DataPropertyName = column.ColumnName; newColumn.ReadOnly = column.IsReadOnly; dataGrid.Columns.Add(newColumn); } else if (column.Mode == ColumnEditorMode.ListBox) { DataGridViewColumn newColumn; if (column.IsReadOnly) { var _newColumn = new DataGridViewTextBoxColumn(); newColumn = _newColumn; } else { var _newColumn = new DataGridViewLinkColumn(); _newColumn.TrackVisitedState = false; _newColumn.LinkBehavior = LinkBehavior.HoverUnderline; newColumn = _newColumn; } column.GeneratedDataGridViewColumn = newColumn; newColumn.SortMode = DataGridViewColumnSortMode.Automatic; newColumn.HeaderText = column.HeaderText; if (column.FillWeight.HasValue) { newColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; newColumn.FillWeight = column.FillWeight.Value; newColumn.MinimumWidth = column.HeaderText.Length * 10; if (newColumn.MinimumWidth < 50) { newColumn.MinimumWidth = 50; } } newColumn.ToolTipText = column.ColumnName; newColumn.DataPropertyName = column.ColumnName; newColumn.ReadOnly = true; if (column.Style.HasValue) { DataGridViewExtenders.SetEditorDataStyle(newColumn, column.Style.Value); } newColumn.Tag = Tuple.Create(column.DataSource, column.ValueMember, column.DisplayMember, column.GetListBoxItemsMethod, column.FormatValueMethod); dataGrid.Columns.Add(newColumn); dataGrid.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e) { var _data = newColumn.Tag as Tuple <object, string, string, GetListBoxItemsDelegate, FormatValueDelegate>; if (_data != null && e.ColumnIndex == newColumn.Index && e.RowIndex >= 0) { if (_data.Item5 != null) { var _value = _data.Item5.Invoke(dataGrid.Rows[e.RowIndex].DataBoundItem, newColumn.DataPropertyName); if (_value != null) { e.Value = _value; e.FormattingApplied = _value is string; } } else if (dataGrid.Rows[e.RowIndex].DataBoundItem is DataRowView && (_data.Item1 is DataView || _data.Item1 is DataTable)) { var dataBoundItem = (DataRowView)dataGrid.Rows[e.RowIndex].DataBoundItem; var _data1 = _data.Item1 is DataView ? ((DataView)_data.Item1).Table : (DataTable)_data.Item1; var _row = _data1.Rows.Find(dataBoundItem[newColumn.DataPropertyName]); e.Value = _row != null ? _row[_data.Item3].ToString() : string.Empty; e.FormattingApplied = true; } } }; if (!column.IsReadOnly) { dataGrid.CellClick += delegate(object sender, DataGridViewCellEventArgs e) { var _data = newColumn.Tag as Tuple <object, string, string, GetListBoxItemsDelegate, FormatValueDelegate>; if (_data != null && e.ColumnIndex == newColumn.Index && e.RowIndex >= 0 && dataGrid.Rows[e.RowIndex].DataBoundItem is DataRowView) { var dataBoundItem = (DataRowView)dataGrid.Rows[e.RowIndex].DataBoundItem; object items = _data.Item1; bool agc = false; if (_data.Item4 != null) { items = _data.Item4.Invoke(); if (items == null) { FormServices.ShowError("No data exists", true); return; } agc = true; } var row = SelectItemForm.GetSelectedRow(items, _data.Item2, _data.Item3, dataBoundItem[newColumn.DataPropertyName], agc); if (row != null) { dataBoundItem.BeginEdit(); dataBoundItem[newColumn.DataPropertyName] = row[_data.Item2]; dataBoundItem.EndEdit(); } } } } ; } else if (column.Mode == ColumnEditorMode.ComboBox) { var newColumn = new DataGridViewComboBoxColumn(); column.GeneratedDataGridViewColumn = newColumn; newColumn.DisplayStyleForCurrentCellOnly = true; newColumn.DisplayStyle = column.IsReadOnly ? DataGridViewComboBoxDisplayStyle.Nothing : DataGridViewComboBoxDisplayStyle.DropDownButton; newColumn.AutoComplete = true; if (column.IsNull) { newColumn.DefaultCellStyle = new DataGridViewCellStyle() { DataSourceNullValue = DBNull.Value } } ; newColumn.SortMode = DataGridViewColumnSortMode.Automatic; newColumn.HeaderText = column.HeaderText; if (column.FillWeight.HasValue) { newColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; newColumn.FillWeight = column.FillWeight.Value; newColumn.MinimumWidth = column.HeaderText.Length * 10; if (newColumn.MinimumWidth < 50) { newColumn.MinimumWidth = 50; } } newColumn.ToolTipText = column.ColumnName; newColumn.DataPropertyName = column.ColumnName; newColumn.DataSource = column.DataSource; if (!string.IsNullOrWhiteSpace(column.ValueMember)) { newColumn.ValueMember = column.ValueMember; } if (!string.IsNullOrWhiteSpace(column.DisplayMember)) { newColumn.DisplayMember = column.DisplayMember; } newColumn.ReadOnly = column.IsReadOnly; dataGrid.Columns.Add(newColumn); if (column.FormatValueMethod != null) { newColumn.Tag = column.FormatValueMethod; dataGrid.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e) { var _data = newColumn.Tag as FormatValueDelegate; if (_data != null && e.ColumnIndex == newColumn.Index && e.RowIndex >= 0) { var _value = _data.Invoke(dataGrid.Rows[e.RowIndex].DataBoundItem, newColumn.DataPropertyName); if (_value != null) { e.Value = _value; e.FormattingApplied = _value is string; } } }; } } } dataGrid.DataSource = DataSource; dataGrid.ResumeLayout(false); }
private static void dataGrid_DataError(object sender, DataGridViewDataErrorEventArgs e) { FormServices.ShowError(e.Exception); e.ThrowException = false; e.Cancel = true; }
/// <summary> /// Fields generator that works on field data descriptions (FieldDataDescriptor) /// </summary> /// <param name="dataPanel">TableLayoutPanel</param> /// <param name="toolTip">ToolTip</param> /// <param name="DataSource">Data Source to support data-binding</param> /// <param name="Fields">Field data descriptors</param> public static void GenerateFields(this TableLayoutPanel dataPanel, ToolTip toolTip, object DataSource, params FieldDataDescriptor[] Fields) { dataPanel.SuspendLayout(); dataPanel.Controls.Clear(); if (DataSource == null || Fields == null || Fields.Length == 0) { return; } dataPanel.ColumnStyles.Clear(); dataPanel.ColumnCount = 2; dataPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); dataPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); dataPanel.RowStyles.Clear(); dataPanel.RowCount = 0; dataPanel.AutoSize = true; dataPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink; dataPanel.Margin = new Padding(3, 3, 9, 3); int tabIndex = 0; foreach (var field in Fields) { dataPanel.RowCount += 1; dataPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); #region creating the label var leadLabel = new Label(); leadLabel.Text = field.CaptionText; // TODO: add option for generating label in format: column.CaptionText + ":" leadLabel.TextAlign = ContentAlignment.MiddleRight; leadLabel.Padding = new Padding(0, 0, 0, 0); if (field.Mode == FieldEditorMode.MultilineTextBox || field.Mode == FieldEditorMode.BitMask || field.Mode == FieldEditorMode.BitMask64) { leadLabel.Anchor = AnchorStyles.Right | AnchorStyles.Top; leadLabel.Margin = new Padding(12, 6, 0, 6); } else { leadLabel.Anchor = AnchorStyles.Right; leadLabel.Margin = new Padding(12, 1, 0, 1); } leadLabel.TabIndex = tabIndex++; leadLabel.AutoSize = true; dataPanel.Controls.Add(leadLabel, 0, dataPanel.RowCount - 1); #endregion Binding binding = null; if (field.Mode == FieldEditorMode.TextBox || field.Mode == FieldEditorMode.MultilineTextBox || field.Mode == FieldEditorMode.DateTimeTextBox) { #region creating editor control for text var _textBox = new TextBox(); field.GeneratedControl = _textBox; _textBox.Multiline = field.Mode == FieldEditorMode.MultilineTextBox; _textBox.Size = new Size(field.SizeWidth.HasValue ? field.SizeWidth.Value : (int)DataDescriptorSizeWidth.Normal, _textBox.Multiline ? 125 : 20); _textBox.Anchor = AnchorStyles.Left; if (field.MaxLength.HasValue) { _textBox.MaxLength = field.MaxLength.Value; } _textBox.TabIndex = tabIndex++; if (toolTip != null) { toolTip.SetToolTip(_textBox, field.ColumnName); } leadLabel.Click += delegate { _textBox.Focus(); }; binding = new Binding("Text", DataSource, field.ColumnName, true, field.IsReadOnly ? DataSourceUpdateMode.Never : DataSourceUpdateMode.OnPropertyChanged); if (field.FormatValueMethod != null) { _textBox.Tag = field.FormatValueMethod; binding.FormattingEnabled = true; binding.Format += TableLayoutPanelExtenders.BindingFormat; } if (field.IsNull) { binding.DataSourceNullValue = DBNull.Value; } if (field.NullValue != null) { binding.NullValue = field.NullValue; } if (field.Style.HasValue) { TableLayoutPanelExtenders.SetBindingStyle(binding, field.Style.Value); _textBox.TextAlign = field.Style == EditorDataStyle.DateTime || field.Style == EditorDataStyle.Date ? HorizontalAlignment.Center : HorizontalAlignment.Right; } _textBox.DataBindings.Add(binding); _textBox.ReadOnly = field.IsReadOnly; if (field.DataSource != null && field.DataSource is string[]) { _textBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; _textBox.AutoCompleteSource = AutoCompleteSource.CustomSource; _textBox.AutoCompleteCustomSource = new AutoCompleteStringCollection(); _textBox.AutoCompleteCustomSource.AddRange((string[])field.DataSource); } dataPanel.Controls.Add(_textBox, 1, dataPanel.RowCount - 1); #endregion } else if (field.Mode == FieldEditorMode.NumberTextBox) { #region creating editor control for numbers var _textBox = new NumericUpDown(); field.GeneratedControl = _textBox; _textBox.Minimum = field.Minimum.HasValue ? field.Minimum.Value : decimal.MinValue; _textBox.Maximum = field.Maximum.HasValue ? field.Maximum.Value : decimal.MaxValue; _textBox.DecimalPlaces = 0; _textBox.ThousandsSeparator = true; _textBox.Size = new Size(field.SizeWidth.HasValue ? field.SizeWidth.Value : (int)DataDescriptorSizeWidth.Normal, 20); _textBox.Anchor = AnchorStyles.Left; _textBox.TabIndex = tabIndex++; if (toolTip != null) { toolTip.SetToolTip(_textBox, field.ColumnName); } leadLabel.Click += delegate { _textBox.Focus(); }; binding = new Binding("Text", DataSource, field.ColumnName, true, field.IsReadOnly ? DataSourceUpdateMode.Never : DataSourceUpdateMode.OnPropertyChanged); if (field.FormatValueMethod != null) { _textBox.Tag = field.FormatValueMethod; binding.FormattingEnabled = true; binding.Format += TableLayoutPanelExtenders.BindingFormat; } if (field.IsNull) { binding.DataSourceNullValue = DBNull.Value; } if (field.NullValue != null) { binding.NullValue = field.NullValue; } if (field.Style.HasValue) { TableLayoutPanelExtenders.SetBindingStyle(binding, field.Style.Value); _textBox.TextAlign = HorizontalAlignment.Right; } _textBox.DataBindings.Add(binding); _textBox.ReadOnly = field.IsReadOnly; dataPanel.Controls.Add(_textBox, 1, dataPanel.RowCount - 1); #endregion } else if (field.Mode == FieldEditorMode.CheckBox) { #region creating editor control for booleans var _checkBox = new CheckBox(); field.GeneratedControl = _checkBox; _checkBox.Anchor = AnchorStyles.Left; _checkBox.AutoSize = false; _checkBox.Size = new Size(20, 20); _checkBox.TabIndex = tabIndex++; if (toolTip != null) { toolTip.SetToolTip(_checkBox, field.ColumnName); } leadLabel.Click += delegate { _checkBox.Checked = !_checkBox.Checked; }; if (field.IsNull) { _checkBox.DataBindings.Add(new Binding("CheckState", DataSource, field.ColumnName, true, field.IsReadOnly ? DataSourceUpdateMode.Never : DataSourceUpdateMode.OnPropertyChanged, CheckState.Indeterminate)); _checkBox.ThreeState = true; } else { _checkBox.DataBindings.Add(new Binding("Checked", DataSource, field.ColumnName, false, field.IsReadOnly ? DataSourceUpdateMode.Never : DataSourceUpdateMode.OnPropertyChanged, false)); } _checkBox.Enabled = !field.IsReadOnly; dataPanel.Controls.Add(_checkBox, 1, dataPanel.RowCount - 1); #endregion } else if (field.Mode == FieldEditorMode.ListBox) { #region creating editor control for lists with dialog var _comboBox = new ComboBox(); field.GeneratedControl = _comboBox; _comboBox.Size = new Size(field.SizeWidth.HasValue ? field.SizeWidth.Value : (int)DataDescriptorSizeWidth.Normal, 21); _comboBox.Anchor = AnchorStyles.Left; if (field.MaxLength.HasValue) { _comboBox.MaxLength = field.MaxLength.Value; } _comboBox.TabIndex = tabIndex++; _comboBox.DropDownStyle = ComboBoxStyle.Simple; if (toolTip != null) { toolTip.SetToolTip(_comboBox, field.ColumnName); } leadLabel.Click += delegate { _comboBox.Focus(); }; if (field.FormatValueMethod != null) { binding = new Binding("Text", DataSource, field.ColumnName, true, DataSourceUpdateMode.Never); _comboBox.Tag = field.FormatValueMethod; binding.FormattingEnabled = true; binding.Format += TableLayoutPanelExtenders.BindingFormat; if (field.IsNull) { binding.DataSourceNullValue = DBNull.Value; } _comboBox.DataBindings.Add(binding); } else { binding = new Binding("SelectedValue", DataSource, field.ColumnName, true, DataSourceUpdateMode.Never); if (field.IsNull) { binding.DataSourceNullValue = DBNull.Value; } _comboBox.DataBindings.Add(binding); } _comboBox.DataSource = field.DataSource; if (!string.IsNullOrWhiteSpace(field.ValueMember)) { _comboBox.ValueMember = field.ValueMember; } if (!string.IsNullOrWhiteSpace(field.DisplayMember)) { _comboBox.DisplayMember = field.DisplayMember; } _comboBox.Enabled = false; if (field.IsReadOnly) { dataPanel.Controls.Add(_comboBox, 1, dataPanel.RowCount - 1); } else { var _pnl = new TableLayoutPanel(); _pnl.AutoSize = true; _pnl.AutoSizeMode = AutoSizeMode.GrowAndShrink; _pnl.Margin = new Padding(0); _pnl.Padding = new Padding(0); _pnl.RowCount = 1; _pnl.ColumnCount = 2; _pnl.RowStyles.Add(new RowStyle(SizeType.AutoSize)); _pnl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); _pnl.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); _pnl.Controls.Add(_comboBox, 0, 0); var _btnSelect = new Button(); _btnSelect.Anchor = AnchorStyles.Left; _btnSelect.MaximumSize = new Size(128, 128); _btnSelect.Margin = new Padding(1, 0, 1, 0); _btnSelect.Padding = new Padding(0); _btnSelect.AutoSize = true; _btnSelect.AutoSizeMode = AutoSizeMode.GrowAndShrink; _btnSelect.FlatStyle = FlatStyle.Flat; _btnSelect.FlatAppearance.BorderSize = 0; _btnSelect.FlatAppearance.MouseOverBackColor = SystemColors.GradientActiveCaption; _btnSelect.FlatAppearance.MouseDownBackColor = SystemColors.ControlLight; _btnSelect.Image = Settings.Images.SelectRowImage; _btnSelect.ImageAlign = ContentAlignment.MiddleCenter; _btnSelect.TextAlign = ContentAlignment.MiddleCenter; _btnSelect.TabIndex = tabIndex++; _btnSelect.TabStop = false; if (toolTip != null) { toolTip.SetToolTip(_btnSelect, string.Format("Select a value for {0}", field.ColumnName)); } _pnl.Controls.Add(_btnSelect, 1, 0); _comboBox.Size = new Size((field.SizeWidth.HasValue ? field.SizeWidth.Value : (int)DataDescriptorSizeWidth.Normal) - _btnSelect.Width - _btnSelect.Margin.Left - _btnSelect.Margin.Right - _comboBox.Margin.Right, _comboBox.Height); _btnSelect.Click += delegate(object sender, EventArgs e) { var cm = binding.BindingManagerBase; if (cm != null) { try { var col = cm.GetItemProperties().Find(field.ColumnName, false); if (col != null) { object items = field.DataSource; bool agc = false; if (field.GetListBoxItemsMethod != null) { items = field.GetListBoxItemsMethod.Invoke(); if (items == null) { FormServices.ShowError("No data exists", true); return; } agc = true; } var row = SelectItemForm.GetSelectedRow(items, field.ValueMember, field.DisplayMember, col.GetValue(cm.Current), agc); if (row != null) { col.SetValue(cm.Current, row[field.ValueMember]); cm.EndCurrentEdit(); } } } catch (Exception ex) { FormServices.ShowError(ex); cm.CancelCurrentEdit(); } } }; dataPanel.Controls.Add(_pnl, 1, dataPanel.RowCount - 1); } #endregion } else if (field.Mode == FieldEditorMode.ComboBox || field.Mode == FieldEditorMode.ComboTextBox) { #region creating editor control for drop down lists var _comboBox = new ComboBox(); field.GeneratedControl = _comboBox; _comboBox.Size = new Size(field.SizeWidth.HasValue ? field.SizeWidth.Value : (int)DataDescriptorSizeWidth.Normal, 20); _comboBox.Anchor = AnchorStyles.Left; if (field.MaxLength.HasValue) { _comboBox.MaxLength = field.MaxLength.Value; } _comboBox.TabIndex = tabIndex++; _comboBox.DropDownStyle = field.Mode == FieldEditorMode.ComboBox ? ComboBoxStyle.DropDownList : ComboBoxStyle.DropDown; if (toolTip != null) { toolTip.SetToolTip(_comboBox, field.ColumnName); } leadLabel.Click += delegate { _comboBox.Focus(); if (_comboBox.Enabled) { _comboBox.DroppedDown = true; } }; binding = new Binding(field.Mode == FieldEditorMode.ComboBox ? "SelectedValue" : "Text", DataSource, field.ColumnName, true, field.IsReadOnly ? DataSourceUpdateMode.Never : DataSourceUpdateMode.OnPropertyChanged); if (field.IsNull) { binding.DataSourceNullValue = DBNull.Value; } _comboBox.DataBindings.Add(binding); _comboBox.DataSource = field.DataSource; if (!string.IsNullOrWhiteSpace(field.ValueMember)) { _comboBox.ValueMember = field.ValueMember; } if (!string.IsNullOrWhiteSpace(field.DisplayMember)) { _comboBox.DisplayMember = field.DisplayMember; } _comboBox.Enabled = !field.IsReadOnly; if (field.Mode == FieldEditorMode.ComboTextBox) { _comboBox.AutoCompleteMode = AutoCompleteMode.Append; _comboBox.AutoCompleteSource = AutoCompleteSource.ListItems; } dataPanel.Controls.Add(_comboBox, 1, dataPanel.RowCount - 1); #endregion } else if (field.Mode == FieldEditorMode.GuidEditor) { #region creating editor control for Guid var _textBox = new TextBox(); field.GeneratedControl = _textBox; _textBox.Size = new Size((int)DataDescriptorSizeWidth.Normal, 20); _textBox.Anchor = AnchorStyles.Left; _textBox.TabIndex = tabIndex++; if (toolTip != null) { toolTip.SetToolTip(_textBox, field.ColumnName); } leadLabel.Click += delegate { _textBox.Focus(); }; if (DataSource != null) { _textBox.DataBindings.Add(new Binding("Text", DataSource, field.ColumnName, true, DataSourceUpdateMode.Never, "(null)")); } _textBox.ReadOnly = true; dataPanel.Controls.Add(_textBox, 1, dataPanel.RowCount - 1); #endregion } else if (field.Mode == FieldEditorMode.BitMask || field.Mode == FieldEditorMode.BitMask64) { #region creating editor control for mask (bits) var _listBox = new BitMaskCheckedListBox(); field.GeneratedControl = _listBox; _listBox.Size = new Size(field.SizeWidth.HasValue ? field.SizeWidth.Value : (int)DataDescriptorSizeWidth.Normal, 150); _listBox.Anchor = AnchorStyles.Left; _listBox.TabIndex = tabIndex++; if (toolTip != null) { toolTip.SetToolTip(_listBox, field.ColumnName); } leadLabel.Click += delegate { _listBox.Focus(); }; binding = new Binding(field.Mode == FieldEditorMode.BitMask ? "Value" : "LongValue", DataSource, field.ColumnName, true, field.IsReadOnly ? DataSourceUpdateMode.Never : DataSourceUpdateMode.OnPropertyChanged); if (field.IsNull) { binding.DataSourceNullValue = DBNull.Value; } if (field.NullValue != null) { binding.NullValue = field.NullValue; } if (field.Style.HasValue) { TableLayoutPanelExtenders.SetBindingStyle(binding, field.Style.Value); } _listBox.DataBindings.Add(binding); _listBox.Enabled = !field.IsReadOnly; if (field.DataSource != null) { if (field.DataSource is string[]) { _listBox.Items.AddRange((string[])field.DataSource); if (_listBox.Items.Count > 0) { var _nHeight = _listBox.Items.Count * (_listBox.GetItemHeight(0) + 4) + 1; if (_nHeight < _listBox.Size.Height) { _listBox.Size = new Size(_listBox.Size.Width, _nHeight); } } } else { _listBox.DataSource = field.DataSource; _listBox.DisplayMember = field.DisplayMember; } } dataPanel.Controls.Add(_listBox, 1, dataPanel.RowCount - 1); #endregion } if (field.IsNull && !field.IsReadOnly && field.Mode != FieldEditorMode.CheckBox || field.Mode == FieldEditorMode.GuidEditor) { #region button for clear value if (dataPanel.ColumnCount == 2) { dataPanel.ColumnCount = 3; dataPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); } var _btnClear = new Button(); _btnClear.Anchor = AnchorStyles.Left; if (field.Mode == FieldEditorMode.MultilineTextBox) { _btnClear.Anchor |= AnchorStyles.Top; } _btnClear.MaximumSize = new Size(128, 128); _btnClear.Margin = new Padding(1, 0, 1, 0); _btnClear.Padding = new Padding(0); _btnClear.AutoSize = true; _btnClear.AutoSizeMode = AutoSizeMode.GrowAndShrink; _btnClear.FlatStyle = FlatStyle.Flat; _btnClear.FlatAppearance.BorderSize = 0; _btnClear.FlatAppearance.MouseOverBackColor = SystemColors.GradientActiveCaption; _btnClear.FlatAppearance.MouseDownBackColor = SystemColors.ControlLight; _btnClear.Image = Settings.Images.ClearFieldImage; _btnClear.ImageAlign = ContentAlignment.MiddleCenter; _btnClear.TextAlign = ContentAlignment.MiddleCenter; _btnClear.TabIndex = tabIndex++; _btnClear.TabStop = false; if (toolTip != null) { toolTip.SetToolTip(_btnClear, string.Format("Clear value from {0}", field.ColumnName)); } _btnClear.Click += delegate { var cm = binding.BindingManagerBase; if (cm != null) { try { var col = cm.GetItemProperties().Find(binding.BindingMemberInfo.BindingMember, false); if (col != null && cm.Count > 0) { col.SetValue(cm.Current, DBNull.Value); } cm.EndCurrentEdit(); binding.Control.Focus(); } catch (Exception ex) { FormServices.ShowError(ex); cm.CancelCurrentEdit(); } } }; dataPanel.Controls.Add(_btnClear, 2, dataPanel.RowCount - 1); #endregion } } dataPanel.ResumeLayout(false); }