2016-07-13 18 views
0

Ich entwickle eine Windows-Formularanwendung. Erstellen einer Benutzeroberfläche für einen Dienst Was ist passiert, wenn ich die Anwendung erstellt habe, gibt es verschiedene Schaltflächen, auf denen ein einzelner Klick funktionieren sollte, um den Wert zu erhalten und einzustellen, aber nach der Fertigstellung des Codes reagieren alle diese Knöpfe auf einen Doppelklick. Wenn wir einen Haltepunkt anwenden und testen, werden die Werte nur mit einem Klick abgerufen und gesetzt, aber während der Laufzeit muss ein Doppelklick ausgeführt werden. Kann jemand helfen?C#. Wie man Doppelklick vermeidet, wenn ich Einzelklick brauche

+1

Könnten Sie bitte einen Beispielcode einfügen, der so reagiert? –

+0

Es tut mir leid, aber es enthält den gesamten Code. Als ich diesen Code vervollständigte, reagierte er mit einem Doppelklick. Ich bekomme und setze den Wert auf CAN-Bus. zunächst, wenn wir den Signalwert erhalten und setzen müssen und wenn der Wert vom doppelten Typ war, ging alles richtig. Wenn der Werttyp jedoch in den Objekttyp geändert wurde, wurde die Rekation mit Doppelklick gestartet. – AutoEng

+0

Einige Schnipsel können mehr als deine Worte sprechen. und das wird klarer für uns –

Antwort

0

Ich habe die Lösung, indem Sie ein Stück Code schreiben. Nur die Taste beim ersten Klick aktiviert.

bool firstClick = true; {if (firstClick) {button.select(); // Aktivieren der Schaltfläche}}

Vielen Dank für Ihre Antworten.

0

Hier ist eine vollständige Article von MSDN auf, wie nur Single-Click vs nur Doppelklick verwenden. Außerdem erfahren Sie, wie Sie mit Ereignissen umgehen und zwischen einem einzelnen Klick und einem Doppelklick unterscheiden können.

Der Artikel verwendet Boolean und Timer, um das zu tun. Möglicherweise müssen Sie einen Dictionary<Button, boolean> verwenden, wenn Sie mehrere Schaltflächen haben. Ich hoffe es hilft. Hier

ist das Beispiel, wenn die Verbindung bekam oder für einige reaosn entfernt:

das Ereignis Mousedown Griff und die Position und die Zeitspanne zwischen Klicks mit den entsprechenden Systeminformation Eigenschaften und eine Timer-Komponente bestimmen. Führen Sie die entsprechende Aktion aus, je nachdem, ob ein Klick oder ein Doppelklick erfolgt. Das folgende Codebeispiel demonstriert, wie dies getan werden kann.

class Form1 : Form 
{ 
    private Rectangle hitTestRectangle = new Rectangle(); 
    private Rectangle doubleClickRectangle = new Rectangle(); 
    private TextBox textBox1 = new TextBox(); 
    private Timer doubleClickTimer = new Timer(); 
    private ProgressBar doubleClickBar = new ProgressBar(); 
    private Label label1 = new Label(); 
    private Label label2 = new Label(); 
    private bool isFirstClick = true; 
    private bool isDoubleClick = false; 
    private int milliseconds = 0; 

    [STAThread] 
    public static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form1()); 
    } 

    public Form1() 
    { 
     label1.Location = new Point(30, 5); 
     label1.Size = new Size(100, 15); 
     label1.Text = "Hit test rectangle:"; 

     label2.Location = new Point(30, 70); 
     label2.Size = new Size(100, 15); 
     label2.Text = "Double click timer:"; 

     hitTestRectangle.Location = new Point(30, 20); 
     hitTestRectangle.Size = new Size(100, 40); 

     doubleClickTimer.Interval = 100; 
     doubleClickTimer.Tick += 
      new EventHandler(doubleClickTimer_Tick); 

     doubleClickBar.Location = new Point(30, 85); 
     doubleClickBar.Minimum = 0; 
     doubleClickBar.Maximum = SystemInformation.DoubleClickTime; 

     textBox1.Location = new Point(30, 120); 
     textBox1.Size = new Size(200, 100); 
     textBox1.AutoSize = false; 
     textBox1.Multiline = true; 

     this.Paint += new PaintEventHandler(Form1_Paint); 
     this.MouseDown += new MouseEventHandler(Form1_MouseDown); 
     this.Controls.AddRange(new Control[] { doubleClickBar, textBox1, 
      label1, label2 }); 
    } 

    // Detect a valid single click or double click. 
    void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     // Verify that the mouse click is in the main hit 
     // test rectangle. 
     if (!hitTestRectangle.Contains(e.Location)) 
     { 
      return; 
     } 

     // This is the first mouse click. 
     if (isFirstClick) 
     { 
      isFirstClick = false; 

      // Determine the location and size of the double click 
      // rectangle area to draw around the cursor point. 
      doubleClickRectangle = new Rectangle(
       e.X - (SystemInformation.DoubleClickSize.Width/2), 
       e.Y - (SystemInformation.DoubleClickSize.Height/2), 
       SystemInformation.DoubleClickSize.Width, 
       SystemInformation.DoubleClickSize.Height); 
      Invalidate(); 

      // Start the double click timer. 
      doubleClickTimer.Start(); 
     } 

     // This is the second mouse click. 
     else 
     { 
      // Verify that the mouse click is within the double click 
      // rectangle and is within the system-defined double 
      // click period. 
      if (doubleClickRectangle.Contains(e.Location) && 
       milliseconds < SystemInformation.DoubleClickTime) 
      { 
       isDoubleClick = true; 
      } 
     } 
    } 

    void doubleClickTimer_Tick(object sender, EventArgs e) 
    { 
     milliseconds += 100; 
     doubleClickBar.Increment(100); 

     // The timer has reached the double click time limit. 
     if (milliseconds >= SystemInformation.DoubleClickTime) 
     { 
      doubleClickTimer.Stop(); 

      if (isDoubleClick) 
      { 
       textBox1.AppendText("Perform double click action"); 
       textBox1.AppendText(Environment.NewLine); 
      } 
      else 
      { 
       textBox1.AppendText("Perform single click action"); 
       textBox1.AppendText(Environment.NewLine); 
      } 

      // Allow the MouseDown event handler to process clicks again. 
      isFirstClick = true; 
      isDoubleClick = false; 
      milliseconds = 0; 
      doubleClickBar.Value = 0; 
     } 
    } 

    // Paint the hit test and double click rectangles. 
    void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     // Draw the border of the main hit test rectangle. 
     e.Graphics.DrawRectangle(Pens.Black, hitTestRectangle); 

     // Fill in the double click rectangle. 
     e.Graphics.FillRectangle(Brushes.Blue, doubleClickRectangle); 
    } 
} 
0

Sie können einfach Klick und Doppel mit Hilfe eines Timers identifizieren. Hier ist das Beispiel

class Form1 : Form 
{ 
     Timer timer; 

     public Form1() 
     { 
      InitializeComponent(); 
      timer = new Timer(); 
      timer.Interval = 500; 
      timer.Tick += new EventHandler(Timer_Tick); 
     } 
     private void App_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Clicks == 1) 
      { 
       timer.Start(); 
      } 
      else 
      { 
       timer.Stop(); 
       doubleClick(); 
      } 
     } 

     private void Timer_Tick(object sender, EventArgs e) 
     { 
      timer.Stop(); 
      singleClick(); 
     } 

     //Single click 
     public void singleClick() 
     { 
      MessageBox.Show("Single Click."); 
     } 

     //Double click 
     public void doubleClick() 
     { 
      MessageBox.Show("Double Click."); 
     } 
} 
+0

Eine weitere Sache. Ich bin mir nicht sicher, ob es nur mit Doppelklick funktioniert. wie, wenn wir einmal klicken und etwas Zeit sagen sagen 2 Sekunden und klicken Sie wieder, dann auch seine Einnahme. Scheint wie Formular laden kann das Problem sein. Danke für die Lösung, ich werde diese versuchen. aber immer noch meinen Kommentar in Betracht ziehen. – AutoEng

Verwandte Themen