2012-01-26 6 views
0

私は外部クラス、つまりメインフォームから処理されるパブリックイベントを提供するカスタムコントロールを実装しています。親フォームが再フォーカスするまでMessageBoxは非表示のままです

メインフォームでは、これらのイベントを処理できます(私の場合は、高度なTabControlです)。

私のカスタムコントロールの抜粋:

public class FlatTabControlEx : TabControl { 
    public delegate void OnTabCloseQueryDelegate(int tabIndex, TabPage tabPage); 
    public event OnTabCloseQueryDelegate TabCloseQuery; 

    protected override void OnPaint(PaintEventArgs e) { 
    DrawControl(e.Graphics); 
    base.OnPaint(e); 
    } 

    protected override void OnClick(EventArgs e) { 
    var imageRect = GetImageRectangle() 
    bool mouseOver = imageRect.Contains(GetMousePos());   
    if (mouseOver) { 
     if (TabCloseQuery != null) { 
     TabCloseQuery(i, TabPages[i]); 
     } 
    } 
    } 
} 

そして、ここでは、私はそのイベントを処理する方法である:

public partial class TestForm : Form { 
    public TestForm() { 
    InitializeComponent(); 

    _flatTabControlEx.TabCloseQuery += (index, tabPage) => { 
     if (MessageBox.Show("Close tab with title " + tabPage.Text, "Question", MessageBoxButtons.YesNo) == DialogResult.Yes) { 
     _flatTabControlEx.TabPages.Remove(tabPage); 
     } 
    }; 
    } 
} 

はどういうわけか、メッセージボックスが(そのメインフォームで?)隠されますとだけショーメインフォームが失われてフォーカスを取り戻すと、別の所有者に提供することは役に立たなかったようです。

このケースをどのように処理できますか?その動作はどのように起こりますか?

編集1:上記の最小化コードをいくつか追加しました。

編集2:私はそれがMessageBox上に描かれた実際のコントロールだと気付きました。どのように描画するのかを決めるにはどうすればいいですか?

+0

鳴きます。この動作を再現するポストコード。 –

+0

私はカスタムスレッドを実装していません。私はデフォルトのOnPaintをオーバーライドします、それが原因かもしれませんか?とにかく、上記のコードが追加されました。 – fjdumont

答えて

0

私はdatagridviewのcellpaintingイベントで同じ問題がありました。 繰り返しを避けることです。

コントロールから離れると、検証、ペイントなどのイベントがトリガーされます。

このケースでは、メッセージボックスを開くと、コントロールは自分のタスクをレビューしてやり始めます。データ形式の間違いを止めるプロセスがある場合は、ペイントタスクが親フォームを上にしておくので、メッセージボックスが残ってしまいます。

これは(Winformsのが、それは同じである必要があります)私の解決策だったスレッドの問題のような

Public Class HybridDataGridView 
Inherits DataGridView 
WithEvents NewDataGridViewTextBox As New TextBox 
Private NoFocus As Integer = 0 

Private Sub HybridDataGridView_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus 
    NoFocus = 1 
End Sub 
Private Sub HybridDataGridView_GotFocus(sender As Object, e As EventArgs) Handles Me.GotFocus 
    NoFocus = 0 
    End Sub 
Private Sub HybridDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles Me.CellPainting 
    If Me.CurrentCell Is Nothing Then 
     Exit Sub 
    End If 
    Dim Kalem As Pen 
    If e.ColumnIndex = Me.CurrentCell.ColumnIndex And e.RowIndex = Me.CurrentCell.RowIndex Then 
     If NoFocus = 0 Then 
      Kalem = New Pen(Color.Black, 1) 
      e.PaintBackground(e.ClipBounds, True) 
      e.PaintContent(e.ClipBounds) 
     End if 
     End if 

    End sub 
End Class 
+1

答えを書き換えてフォーマットすることができますか? –

関連する問題