Laden...

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

Erstellt von Gremgiz vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.479 Views
G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 13 Jahren
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

N
3 Beiträge seit 2010
vor 13 Jahren

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

3.511 Beiträge seit 2005
vor 13 Jahren

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)

N
3 Beiträge seit 2010
vor 13 Jahren

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 😃

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 13 Jahren

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 😃

5.299 Beiträge seit 2008
vor 13 Jahren

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.

B
293 Beiträge seit 2008
vor 13 Jahren

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.

5.299 Beiträge seit 2008
vor 13 Jahren

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.

3.511 Beiträge seit 2005
vor 13 Jahren

WM_LBUTTONDBLCLK wars. Genau den habe ich gemeint 😃

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

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 13 Jahren

Ich werde es mal testen. Vielen Dank Euch allen

Gruß
gremgiz

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 13 Jahren

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

B
293 Beiträge seit 2008
vor 13 Jahren

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.

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 13 Jahren

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