Laden...

DataGridViewComboboxColumn mit SelectedItem-Property

Erstellt von inflames2k vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.569 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 11 Jahren
DataGridViewComboboxColumn mit SelectedItem-Property

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:


public class ExtendedDataGridViewComboboxCell : System.Windows.Forms.DataGridViewComboBoxCell
{
	public ExtendedDataGridViewComboboxCell() : base()
	{
	}
		
        // just a flag to check if the selected index changed
        // was really thrown for this cell
	private bool _bEditingControlShowing = false;
		
	public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
	{
		base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
			
                // get the editing control for 
                // subscribing the selected index changed event
		DataGridViewComboBoxEditingControl ctrl = DataGridView.EditingControl as DataGridViewComboBoxEditingControl;			
		ctrl.SelectedIndexChanged += new EventHandler(ctrl_SelectedIndexChanged);
			
                // set the current value
		if(this.Value != null)
		{
			ctrl.SelectedItem = this.Value;				
		}
		else
		{
			ctrl.SelectedItem = this.DefaultNewRowValue;
		}
			
		_bEditingControlShowing = true;
	}
		
	private Object _selectedItem;
	/// <summary>
	/// gets the selected item
	/// </summary>
	public Object SelectedItem 
	{
		get { return _selectedItem; }
		private set { _selectedItem = value; }
	}

	/// <summary>
	/// eventhandler for selected index changed of the editing control
	/// </summary>
	void ctrl_SelectedIndexChanged(object sender, EventArgs e)
	{
		// get the editing control
		DataGridViewComboBoxEditingControl control = sender as DataGridViewComboBoxEditingControl;
		
		// we have to check if the row index of the editing control is 
		// the index of this cell otherwise the value will be set
		// on all cells working with the control
		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.


public class ExtendedDataGridViewComboboxColumn : System.Windows.Forms.DataGridViewComboBoxColumn
{		
	public ExtendedDataGridViewComboboxColumn() : base()
	{
		this.CellTemplate = new ExtendedDataGridViewComboboxCell();
	}
}

Schlagwörter: DataGridViewComboboxColumn SelectedItem auslesen, DataGridViewComboboxColumn mit SelectedItem, DataGridView, ExtendedDataGridViewComboboxColumn

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |