Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bei Doppelklick auf Text in Textbox soll (trotzdem/nur) ein Event ausgelöst werden
Gremgiz
myCSharp.de - Member



Dabei seit:
Beiträge: 106

Themenstarter:

Bei Doppelklick auf Text in Textbox soll (trotzdem/nur) ein Event ausgelöst werden

beantworten | zitieren | melden

Hallo,

ich erzeuge zur Laufzeit einige Textboxen, die ich mit einem Doppelklick Event versehe. Wenn ich in der Textbox einen Doppelklick mache, wird jedoch nur das Wort markiert udn das Event nicht ausgeführt. Klicke ich auf den Rahme der Textbox feuert das Event. Ich will aber nicht den text markieren, sondern das Event ausklösen. Kann mir bitte jemand helfen, wie ich das lösen kann?

Danke
gremgiz
private Nachricht | Beiträge des Benutzers
newsted
myCSharp.de - Member



Dabei seit:
Beiträge: 3
Herkunft: Bern

beantworten | zitieren | melden

Eventuell hilft dir die TextBox.Select()-Methode weiter? MSDN
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

beantworten | zitieren | melden

Gremgiz will den text ja NICHT auswählen, newsted.

Ich weiß es jetzt nicht zu 100%, aber wahrscheinlich müsstest du WndProc überschreiben, da die .NET Textbox nur ein Wrapper um die Win32 Box ist. Dann müsstest du die passende Nachricht abfangen (hab ich auch grad nicht im Kopf :))
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
newsted
myCSharp.de - Member



Dabei seit:
Beiträge: 3
Herkunft: Bern

beantworten | zitieren | melden

Das ist mir bewusst, Khalid

Bin davon ausgegangen, dass

textBox1.Select(0, 0);

den gewünschten Effekt erzielt. Jedoch sieht man trotzdem ein kurzes Blinken des Textes.

Daher bitte ignorieren :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von newsted am .
private Nachricht | Beiträge des Benutzers
Gremgiz
myCSharp.de - Member



Dabei seit:
Beiträge: 106

Themenstarter:

beantworten | zitieren | melden

Nun ja, Select hilft nicht, wie bereits beschrieben. Momentan habe ich mir noch nen Button dazugebaut. Ist zwar nicht ganz so komfortable aber es hilft erst mal.

Danke

PS: Wenn Ideen bestehen - her damit :-)
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

ich hab daas grad mit einer Richtexxtbox ausprobiert, blinkt beimir nix


      private bool _SelChanging = false;
      private int _OldSel;
      protected override void OnSelectionChanged(EventArgs e) {
         if(_SelChanging) return;
         if(SelectionLength > 0) {
            _SelChanging = true; 
            Select(_OldSel,0); 
            _SelChanging = false; 
         }
         _OldSel = SelectionStart;
         base.OnSelectionChanged(e);
      }
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

beantworten | zitieren | melden

Idee! ;)

Statt Textbox folgende abgeleitete Version nehmen.

class NoSelectTextBox : TextBox
    {
     
        const int WM_LBUTTONDBLCLK = 0x203;
        protected override void WndProc(ref Message m)
        {
            bool fHandled = false;

            switch (m.Msg)
            {
                case WM_LBUTTONDBLCLK:
                   
                    fHandled = true;                   
                    break;  
            }

            if (!fHandled)
            {
                base.WndProc(ref m);
            }
        }
    }

und das "Doppelklick Event", wie folgt auslösen:


Timer ti = new Timer();
        bool doubleclk = false;
        private void textBox1_MouseClick(object sender, MouseEventArgs e)
        {
            ti.Interval = 250;
            ti.Tick += new EventHandler(ti_Tick);

            if (!doubleclk)
            {
                doubleclk = true;
                ti.Start();
            }
            else
            {
                MessageBox.Show("das war ein doppelklick!");
            }
        }

        void ti_Tick(object sender, EventArgs e)
        {
            ti.Stop();
            doubleclk = false;
        }

Ist zwar Quick'n'Dirty - aber funktioniert. (Sogar ohne flackern ;P )
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von blutiger_anfänger am .
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

cool! noch vereinfacht:


   class NoSelectTextBox:TextBox {
      const int WM_LBUTTONDBLCLK = 0x203;
      protected override void WndProc(ref Message m) {
         switch(m.Msg) {
         case WM_LBUTTONDBLCLK:
            base.OnDoubleClick(EventArgs.Empty);
            return;
         }
         base.WndProc(ref m);
      }
   }
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

beantworten | zitieren | melden

WM_LBUTTONDBLCLK wars. Genau den habe ich gemeint :)
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
Gremgiz
myCSharp.de - Member



Dabei seit:
Beiträge: 106

Themenstarter:

beantworten | zitieren | melden

Ich werde es mal testen. Vielen Dank Euch allen

Gruß
gremgiz
private Nachricht | Beiträge des Benutzers
Gremgiz
myCSharp.de - Member



Dabei seit:
Beiträge: 106

Themenstarter:

beantworten | zitieren | melden

Habe es gerade probiert - funzt leider nicht. Gleiche wie vorher. Rand geklickt - geht. Innerhable der TB Doppelklick geht nicht. Code habe per Copy& paste zu testzwecken genommen. Die Variablendeklaration für das event sind im Kopf der Klasse definiert, in der das Event aufgerufen wird.

Ich glaube ich bleibe bei dem Button :-(

Gruß
Gremgiz
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

beantworten | zitieren | melden

Hallo Gremgiz,

ich behaupte, dass das zu 100% klappt. ;) Wenn du uns den entsprechenden Quellcode mal zu kommen lassen würdest, dann könnten die anderen, sowie auch ich mal einen Blick drauf werfen und dir weiter helfen.
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
private Nachricht | Beiträge des Benutzers
Gremgiz
myCSharp.de - Member



Dabei seit:
Beiträge: 106

Themenstarter:

beantworten | zitieren | melden

Aber gerne doch:

namespace XYZ
{
    Timer ti = new Timer();
    bool doubleclk = false;

    class NoSelectTextBox : KryptonTextBox
    {
        const int WM_LBUTTONDBLCLK = 0x203;
        protected override void WndProc(ref Message m)
        {
            bool fHandled = false;

            switch (m.Msg)
            {
                case WM_LBUTTONDBLCLK:

                    fHandled = true;
                    break;
            }

            if (!fHandled)
            {
                base.WndProc(ref m);
            }
        }
    }



private void Listenaufruf()
{
    for (int i = 0; i < Array.Count; i+=22)
    {
         KryptonTextBox TextBox = NoSelectedTextBox();
         TextBox.MouseClick += new MouseEventHandler(TB_Ticket_MouseClick);
         //weitere TB Formatierungen (Font, Name, etc)
        //Hinzufügen zum TableLayoutPanel
    }  
}

private void TextBox_MouseClick(object sender, MouseEventArgs e)
        {
            ti.Interval = 250;
            ti.Tick += new EventHandler(ti_Tick);

            if (!doubleclk)
            {
                doubleclk = true;
                ti.Start();
            }
            else
            {
                MessageBox.Show("das war ein doppelklick!");
            }
        }

        void ti_Tick(object sender, EventArgs e)
        {
            ti.Stop();
            doubleclk = false;
        }

Hinweis: Die KryptonTextBox kommt aus dem Toolkit von Component Factory und basiert auf der WinForms TextBox. Alle Properties sind vererbt
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Gremgiz am .
private Nachricht | Beiträge des Benutzers