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