Laden...

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

Letzter Beitrag vor 13 Jahren 13 Posts 2.531 Views
Bei Doppelklick auf Text in Textbox soll (trotzdem/nur) ein Event ausgelöst werden

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

Eventuell hilft dir die TextBox.Select()-Methode weiter? MSDN

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)

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 😃

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 😃

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.

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 )

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

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.

WM_LBUTTONDBLCLK wars. Genau den habe ich gemeint 😃

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Ich werde es mal testen. Vielen Dank Euch allen

Gruß
gremgiz

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

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.

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