myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » [gelöst] DataGridViewComboBox DropDown-List bleibt erst bei zweitem Click auf
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
menel menel ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.10.2008
Beiträge: 35
Entwicklungsumgebung: Visual Studio 2008 express


menel ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Kollegen,

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

C#-Code:
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

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von menel am 24.10.2008 13:09.

22.10.2008 17:04 Beiträge des Benutzers | zu Buddylist hinzufügen
menel menel ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.10.2008
Beiträge: 35
Entwicklungsumgebung: Visual Studio 2008 express

Themenstarter Thema begonnen von menel

menel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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":

C#-Code:
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
23.10.2008 16:34 Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nur, das du nicht denkst, dein Prob interessiert niemandn. Ich hab da überne Stunde dran rumgemacht - ohne jedes Ergebnis unglücklich
23.10.2008 17:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
menel menel ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.10.2008
Beiträge: 35
Entwicklungsumgebung: Visual Studio 2008 express

Themenstarter Thema begonnen von menel

menel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 Augenzwinkern

lg menel
23.10.2008 17:08 Beiträge des Benutzers | zu Buddylist hinzufügen
mabo
myCSharp.de-Mitglied

Dabei seit: 16.05.2007
Beiträge: 334
Entwicklungsumgebung: VS 2013 Prof. , Eclipse


mabo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von mabo am 23.10.2008 18:09.

23.10.2008 18:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
23.10.2008 18:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
mabo
myCSharp.de-Mitglied

Dabei seit: 16.05.2007
Beiträge: 334
Entwicklungsumgebung: VS 2013 Prof. , Eclipse


mabo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

stell mal den EditMode auf EditOnEnter Augenzwinkern
23.10.2008 18:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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).
23.10.2008 19:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
menel menel ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.10.2008
Beiträge: 35
Entwicklungsumgebung: Visual Studio 2008 express

Themenstarter Thema begonnen von menel

menel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 Augenzwinkern .
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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von menel am 24.10.2008 08:42.

24.10.2008 08:27 Beiträge des Benutzers | zu Buddylist hinzufügen
menel menel ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.10.2008
Beiträge: 35
Entwicklungsumgebung: Visual Studio 2008 express

Themenstarter Thema begonnen von menel

menel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
24.10.2008 10:43 Beiträge des Benutzers | zu Buddylist hinzufügen
menel menel ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.10.2008
Beiträge: 35
Entwicklungsumgebung: Visual Studio 2008 express

Themenstarter Thema begonnen von menel

menel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
24.10.2008 13:08 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Jahre.
Der letzte Beitrag ist älter als 11 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.11.2019 03:38