4 Stimmen

C# Windows Forms Druckdialogfeld klicken Sie zweimal auf OK, um zu antworten

Ich verwende Visual Studio 2008, .net Framework 3.5 für eine Windows-Forms-Client-Server-Anwendung, an der ich gerade arbeite. Es gibt einen seltsamen Fehler, wenn ich das Programm ausführe und versuche zu drucken. Das Druckdialogfeld wird geöffnet, aber ich muss zweimal auf die Schaltfläche OK klicken, damit es funktioniert. Nach dem zweiten Klick funktioniert es einwandfrei, ohne Fehler. Wenn ich einen Haltepunkt bei: if (result == DialogResult.OK) setze, wird der Haltepunkt erst beim zweiten Klick ausgelöst. Hier ist der Code:

private void tbPrint_Click(object sender, EventArgs e)
{
    try
    {
        printDialog1.Document = pDoc;

        DialogResult result = printDialog1.ShowDialog();

        if (result == DialogResult.OK)
        {
            pDoc.PrinterSettings.PrinterName = printDialog1.PrinterSettings.PrinterName;
            pDoc.Print();
        }
        ...

Das treibt mich in den Wahnsinn, und ich kann mir nicht vorstellen, dass irgendetwas anderes dagegen sprechen könnte.

1voto

JonS Punkte 391

Ich bin auf dieses Problem gestoßen, als ich den "ersten Toolstrip-Klick nicht erkannte" mit einer OpenFileDialog in C#/WinForms. Nach viel Fluchen und Googeln, habe ich dies getan:

  1. Sur toolstrip1_Click :

    private void toolStrip1_Click(object sender, EventArgs e)
    {
      this.Validate();
    }
  2. In der Funktion, die die Aufrufe OpenFileDialog :

    private void locateMappingToolStripMenuItem_Click(object sender, EventArgs e)
    {
      OpenFileDialog dg = new System.Windows.Forms.OpenFileDialog();
      if (dg.ShowDialog() == DialogResult.OK)
      {
        fileLocation = Path.GetDirectoryName(dg.FileName);
        try
        {
          if (LoadData())
          {
            //Enable toolbar buttons
            toolStripButton3.Enabled = true;
            toolStripButton5.Enabled = true;
            toolStripButton1.Enabled = true;
            toolStripButton2.Enabled = true;
            searchParm.Enabled = true;
            toolStripButton4.Enabled = true;
            toolStripButton6.Enabled = true;
            exitToolStripMenuItem.Enabled = true;
            EditorForm.ActiveForm.TopLevelControl.Focus();
          }
        }
        catch (Exception exx) 
        {
          MessageBox.Show(exx.Message + Environment.NewLine + exx.InnerException);
        }
      }
    }

Zwei Dinge scheinen entscheidend zu sein:

  • Wenn die OpenFileDialog geschlossen wird, muss der Fokus auf das Hauptfenster zurückgesetzt werden ( EditorForm.ActiveForm.TopLevelControl.Focus(); )
  • Wenn die Schaltfläche "Toolstrip" angeklickt wird, validiert sich der Toolstrip selbst ( this.Validate() ) und erkennt das Mausereignis.

1voto

Mark Punkte 152

Ich habe es mit einer Zeitschaltuhr erreicht.

Legen Sie einen Timer auf das Formular, das die Werkzeugleiste enthält, und verwandeln Sie ihn in einen One-Shot-Timer mit einer Verzögerung von z. B. 1 mS. Hinweis: Für den Timer muss "Aktiviert" zunächst auf "Falsch" gesetzt werden.

private void toolStripBtnPrint_Click(object sender, EventArgs e)
{
   timer1.Interval = 1; // 1ms
   timer1.Enabled = true;
}

Einen Timer-Tick-Event-Handler erstellen

private void timer1_Tick(object sender, EventArgs e)
{
    timer1.Enabled = false;
    PrintDialog printDialogue=new PrintDocument();        
    //Do your initialising here
    if(DialogResult.OK == printDialogue.ShowDialog())
    {
        //Do your stuff here
    }
}

Es mag schmutzig sein, aber es hat mich aus einem Loch herausgeholt. HTH

0voto

joshperry Punkte 39356

Vielleicht handelt es sich um ein ähnliches Problem wie dieses: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/681a50b4-4ae3-407a-a747-87fb3eb427fd

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X