Laden...

[gelöst] DataGridViewComboBox DropDown-List bleibt erst bei zweitem Click auf

Erstellt von menel vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.681 Views
M
menel Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren
[gelöst] DataGridViewComboBox DropDown-List bleibt erst bei zweitem Click auf

Hallo Kollegen,

Ich habe ein gebundenes Datagridview mit lauter DataGridViewComboBoxColumns. Mittels der Funktion:


DataGridViewComboBoxEditingControl editingcontrol = null;
		private void datagridview1_EditingControlShowing( object sender, DataGridViewEditingControlShowingEventArgs e )
		{
			//wenn der zelltyp eine datagridviewcombobox ist
			if( e.Control.GetType( ) == typeof( DataGridViewComboBoxEditingControl ) )
			{
				//as convertiert, löst aber keine exception aus, wenn konvertierung fehl schlägt
				editingcontrol = e.Control as DataGridViewComboBoxEditingControl;
				DataGridView dgv = sender as DataGridView;
				dgv.CurrentCell.PositionEditingControl( true, false, dgv.CurrentCell.ContentBounds, dgv.CurrentCell.ContentBounds, dgv.CurrentCell.InheritedStyle, true, true, false, false );
				editingcontrol.DroppedDown = true;
				editingcontrol.SelectedValueChanged += new EventHandler( editingcontrol_SelectedValueChanged );
			}
		}

ist das öffnen der DropDown-List der ComboBoxen bei Click in die Zelle realisiert.

Nun habe ich aber das Problem, das beim ersten Click in eine beliebige Zelle die DropDownList zwar ausklappt, aber gleich wieder zu geht. Nach dem ersten Click funktioniert es wunderbar, dann auch bei anderen Zellen. Weiß jemand was die Liste beim ersten Clicken wieder schließt?

Vllt. ist das auch wichtig: das DataGridView ist Teil eines zusammengesetzten Steuerelementes, von CustumControls abgeleitet. Vielleicht hat ja am anfang der Container des CustomControl den Fokus und erst beim ersten Click bekommt das DGV den Fokus und deshalb geht die Liste wieder zu??? Wär nett wenn jemand was dazu einfällt.

mfg menel

M
menel Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

ich hab das Problem nochmal genauer unter die Lupe genommen.
Es hat nichts mit der Datenbindung zu tun und auch nichts mit dem CustomControl-Container in dem sich das Grid befindet. Ich hab den Code mal auf das wesentliche reduziert und somit gleichzeitig ein gutes Beispiel erhalten, wie man gute Bedienung in einem Grid mit ComboBoxen realisieren könnte, da das Standardverhalten alles andere als komfortabel ist (zu viele clicks pro Zelle nötig).

hier nochmal der komplette quelltext für das Beispiel. so kann sich jeder mit copy/paste das Problem anschauen. Vielleicht fällt ja doch noch jemandem was zur Lösung ein.

Das Beispiel verlangt ein DataGridView auf einer Windows-Form mit Namen "dataGridView1":


namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1( )
		{
			InitializeComponent( );
		}

		private class MyComboCol : DataGridViewComboBoxColumn
		{
			public MyComboCol( )
				: base( )
			{
				//den DisplayStyle der Combobox einstellen - 
				this.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
				//die comboBoxen mit Inhalt vorbelegen
				this.Items.Add( "eins" );
				this.Items.Add( "zwei" );
				this.Items.Add( "drei" );
			}
		}

		DataGridViewComboBoxEditingControl editingcontrol = null;
		private void dataGridView1_EditingControlShowing( object sender, DataGridViewEditingControlShowingEventArgs e )
		{
			//wenn der zelltyp eine datagridviewcombobox ist
			if( e.Control.GetType( ) == typeof( DataGridViewComboBoxEditingControl ) )
			{
				//as convertiert, löst aber keine exception aus, wenn konvertierung fehl schlägt
				editingcontrol = e.Control as DataGridViewComboBoxEditingControl;
				DataGridView dgv = sender as DataGridView;
				dgv.CurrentCell.PositionEditingControl( true, false, dgv.CurrentCell.ContentBounds, dgv.CurrentCell.ContentBounds, dgv.CurrentCell.InheritedStyle, true, true, false, false );
				editingcontrol.DroppedDown = true;
			}
		}

		private void Form1_Load( object sender, EventArgs e )
		{
			MyComboCol cbCol1 = new MyComboCol( );
			dataGridView1.Columns.Add( cbCol1 );

			MyComboCol cbCol2 = new MyComboCol( );
			dataGridView1.Columns.Add( cbCol2 );

			MyComboCol cbCol3 = new MyComboCol( );
			dataGridView1.Columns.Add( cbCol3 );

			MyComboCol cbCol4 = new MyComboCol( );
			dataGridView1.Columns.Add( cbCol4 );

			//DataRow row1;
			dataGridView1.Rows.Add(  );
			dataGridView1.Rows.Add( );
		}

		private void dataGridView1_CellMouseMove( object sender, DataGridViewCellMouseEventArgs e )
		{
			if( e.RowIndex >= 0 && e.ColumnIndex >= 0 )
			{
				dataGridView1.Cursor = Cursors.Hand;
			}
			else
			{
				if( e.RowIndex >= 0 && e.ColumnIndex == -1 )
				{
					dataGridView1.Cursor = Cursors.PanEast;
				}
				else
				{
					dataGridView1.Cursor = Cursors.Default;
				}
			}
			//Editiermodus beenden
			( sender as DataGridView ).EndEdit( );
		}

		private void dataGridView1_CellMouseClick( object sender, DataGridViewCellMouseEventArgs e )
		{
			//wenn die Zelle keine header-zelle ist
			if( e.RowIndex >= 0 && e.ColumnIndex >= 0 )
			{
				//dann versetze sie in den editiermodus
				( sender as DataGridView ).BeginEdit( false );
			}
		}
	}
}

Nach dem starten des Programms ist der erste click in eine Zelle immer umsonst. erst ab dem zweiten click verhält sich das grid so wie es soll ???

gruß menel

5.299 Beiträge seit 2008
vor 15 Jahren

Nur, das du nicht denkst, dein Prob interessiert niemandn. Ich hab da überne Stunde dran rumgemacht - ohne jedes Ergebnis 🙁

Der frühe Apfel fängt den Wurm.

M
menel Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

hallo EDR,

danke für deine Mühen. ich hoffe, das Beispiel aus Post zwei nimmt evtlen testern etwas arbeit ab. ich hab inzwischen einen kleinen workaround entwickelt, der mir aber nicht gefällt. Ich sende im Form_Load() einen Maus-click ans grid. dann geht es bei der ersten benutzung schon wie es soll, jedoch sieht man beim starten des Programmes wie die liste in der ersten zelle ausklappt und wieder zu geht. das sieht nicht besonders professionell aus 😉

lg menel

M
334 Beiträge seit 2007
vor 15 Jahren

Warum machst du das Öffnen der Dropdown-Box so kompliziert? Die klappt doch eh aus wenn man draufklickt.

5.299 Beiträge seit 2008
vor 15 Jahren

Ohne kompliziert musste 3 mal klicksen, um den DropDown zu kriegen

  1. Zelle anwählen
  2. Editieren aktivieren
  3. DownDroppen

Mit kompliziert wird 2) und 3) zusammengefasst.

Der frühe Apfel fängt den Wurm.

M
334 Beiträge seit 2007
vor 15 Jahren

stell mal den EditMode auf EditOnEnter 😉

5.299 Beiträge seit 2008
vor 15 Jahren

Jau, dassis auch nützlich. Betrifft allerdings das ganze Grid, nicht nur die Column.
Wenn man EditModeOnEnter mit kompliziert kombiniert, kriegt man sogar 1), 2) und 3) auf einen Klick (aber mit der Tasten-Reaktion wirds irgendwie komisch).

Der frühe Apfel fängt den Wurm.

M
menel Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

ich hatte mich hier schon bedankt und ins wochenende verabschiedet. aber es funktioniert doch noch nicht wie gewollt. ich hatte ja gestern den workaround mit dem mouseclick implementiert. den hätte ich vor dem testen wieder entfernen sollen 😉.
das EditOnEnter ist schon mal nicht schlecht, jedoch geht dann das
EndEdit im OnCellMouseMove nicht mehr, da dann die aktuell ausgewählte Zelle die Ereignisse empfängt und nicht mehr das Grid. Somit ist die steuerung schon wieder etwas komisch. ich teste mal den mouseclick-workaround bei meinem Projekt und melde mich dann wieder.

mfg menel

M
menel Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

ich hab jetzt noch ein bisschen mit dem EditOnEnter rumgespielt und habe herausgefunden, das diese Eigenschaft sich genauso verhält als würde ich einen MouseClick absetzen. Beim Laden des Forms klappt kurz die Liste runter. Ich mache es jetzt so, das beim start das Grid auf EditOnEnter steht und später (beim füllen des Grid) schalte ich auf EditOnKeystrokeOrF2 um.
damit bin ich jetzt so halbwegs zufrieden und dieser post kann als erledigt betrachtet werden, wenn auch nicht als optimal gelöst. vielen dank den zwei helfern und ein schönes Wochenende euch.

mfg menel

M
menel Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

ich habe hier im Forum noch einen Thread gefunden, der die Problematik sauber löst.

DataGridView - ComboBox öffnen ohne Row zu selecten

jetzt bin ich mit der Bedienung zufrieden. danke allen Helfern.

mfg Menel