1

タブ コントロールの事前定義されたイベントはありますか、それとも開発できるカスタム イベントで、実際にタブ コントロールから削除される前に、そのタブ コントロールのコントロール コレクションから削除したコントロールでロジックを実行できます。

環境 :

タブページのあるタブコントロールがあります。これらのタブ ページは、参照グリッドのエントリに関連するドキュメントを読み込みます。参照グリッドで行を選択するたびに、対応するドキュメントが読み込まれたタブ ページがタブ コントロールに追加されます。グリッド内のその行のチェック列もチェックされます。

タブ コントロールのタブ ページを閉じて、この閉じたタブ ページを参照グリッドの対応するエントリに関連付けて、その行のチェックを外せるようにしたいと考えています。

タブ コントロールで考えられるすべてのイベントを参照してみましたが、適切なものが見つかりませんでした。ControlRemoved イベントは、タブページが閉じられ、タブ フォーカスが自動的に次のタブに移動した後にのみ発生します。これにより、controlremoved ロジックが失敗し、無限ループに入り、このタブだけでなく、使用可能なすべてのタブを閉じようとします。 、最後のものを閉じたときに無効なインデックス例外をスローします。

4

3 に答える 3

0

タブが削除される前にタブへの参照が必要な場合は、簡単な方法が 1 つあります。TabControl を継承する CustomTabControl を作成し、その OnControlRemoved イベントをオーバーライドします。

あなたがこれを持っている場合:

public class CTabControl:TabControl
    {
        protected override void OnControlRemoved(ControlEventArgs e)
        {
            TabPage tp = e.Control as TabPage; // reference to tab page before it gets removed
            base.OnControlRemoved(e);// gets removed here
        }
    }
于 2013-02-05T07:57:40.707 に答える
0

プログラムでグリッド内の項目のチェックを外したときに、タブ コントロールが更新されないようにする必要があります。そうしないと、常に無限ループに陥り、望ましくない動作が発生します。

これは、ブール値フラグを使用して実現できます。以下のコード例では、現時点でこれをテストするための IDE が手元にないため、「実際の」イベント ハンドラーは使用していませんが、単純な方法で置き換えています。

private bool suppressTabUpdate = false;

private void HandleGridCheckedOrUncheckedEvent()
{
    if (suppressTabUpdate)
        return;
    // Insert logic here to create or remove the tab pages as required
}

private void HandleTabPageRemovedEvent()
{
    suppressTabUpdate = true;
    // Uncheck the item in the grid here
    suppressTabUpdate = false;
}
于 2013-02-05T07:41:05.410 に答える
0

あなたが探している正確なイベントがあるかどうかはわかりませんが、提案する別のアプローチがあります.

一部の UI コードが密接に結びついているように思えます。グリッドとタブ コントロールは、イベント ハンドラーから直接互いに通信してはなりません。これが無限ループの原因です (イベントは前後に「ピンポン」します)。

代わりに、グリッドとタブ コントロールの両方を別の "コンポーネント" (単なるクラス、または既存のフォーム クラスのいくつかのメソッド) で管理し、このコンポーネントでタブの開閉とグリッド内の行の変更を管理することをお勧めします。

たとえば、ユーザーがグリッド内の行を選択した場合、グリッドを直接変更しないでください。代わりに、行が選択されたときに必要なことを行う新しいメソッドを呼び出します: チェックボックスをオンにする、タブを開くなど。 . 行を選択する必要がなくなった場合は、選択を直接変更しないでください: 代わりに、行が選択されていないときに必要なことを行う新しいメソッドを呼び出します: チェックボックスのチェックを外す、タブを閉じるなど.

于 2013-02-05T07:41:19.890 に答える