Beschreibung:
Leider stellt die DataGridViewComboboxCell aus dem Framework keine SelectedItem-Eigenschaft bereit, was besonders dann zu Schwierigkeiten führt, wenn die Spalte Datengebunden ist.
Wie dem Thema
[gelöst] DataGridViewComboBoxCell - Selectiertes Item auslesen, sowie dem MSDN-Beitrag
How to: Access Objects in a Windows Forms DataGridViewComboBoxCell Drop-Down List zu entnehmen ist, geht dies derzeit nur über Workarounds.
Da ich es jedoch weder für sauber halte, dem Business-Objekt eine Property "Self" hinzuzufügen, noch einen Wrapper zu erstellen, um das selektierte Objekt bereit zu stellen, habe ich mir nun also die Zeit genommen und eine abgeleitete DataGridViewColumn erstellt. Diese liefert das gewünschte selektierte Item zurück.
Zuallererst einmal der Code für die erweiterte DataGridViewComboboxCell:
C#-Code: |
public class ExtendedDataGridViewComboboxCell : System.Windows.Forms.DataGridViewComboBoxCell
{
public ExtendedDataGridViewComboboxCell() : base()
{
}
private bool _bEditingControlShowing = false;
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
DataGridViewComboBoxEditingControl ctrl = DataGridView.EditingControl as DataGridViewComboBoxEditingControl;
ctrl.SelectedIndexChanged += new EventHandler(ctrl_SelectedIndexChanged);
if(this.Value != null)
{
ctrl.SelectedItem = this.Value;
}
else
{
ctrl.SelectedItem = this.DefaultNewRowValue;
}
_bEditingControlShowing = true;
}
private Object _selectedItem;
public Object SelectedItem
{
get { return _selectedItem; }
private set { _selectedItem = value; }
}
void ctrl_SelectedIndexChanged(object sender, EventArgs e)
{
DataGridViewComboBoxEditingControl control = sender as DataGridViewComboBoxEditingControl;
if(control.EditingControlRowIndex == this.RowIndex && _bEditingControlShowing)
{
this._selectedItem = control.SelectedItem;
_bEditingControlShowing = false;
}
}
}
|
Um die erweiterte DataGridViewComboboxCell nutzen zu können benötigen wir ebenfalls eine Spalte, die diese Art von Zellen generiert. Diese zugehörige Klasse ist sehr kurz gehalten und setzt im Konstruktor lediglich das CellTemplate.
C#-Code: |
public class ExtendedDataGridViewComboboxColumn : System.Windows.Forms.DataGridViewComboBoxColumn
{
public ExtendedDataGridViewComboboxColumn() : base()
{
this.CellTemplate = new ExtendedDataGridViewComboboxCell();
}
}
|
Schlagwörter: DataGridViewComboboxColumn SelectedItem auslesen, DataGridViewComboboxColumn mit SelectedItem, DataGridView, ExtendedDataGridViewComboboxColumn