DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【C#】TabControlイベント_二回目のClickイベントは処理を行わない方法

環境/言語:[C# VisualStudio2008 NET Framework3.5]
分類:[.NET]

はじめまして。
質問をお願い致します。

以下のように、動的に作成したTabControlを押下されると、Clickイベントを実行し、
DBよりデータを取得、表示されるようにしています。
現状の作りですと、Tabを押下されるたびに、イベントが走ってしまいます。
一回イベントが走ったTabは他のTabが押下された後でないと、
イベント、処理を起こさない様にする為には、どのようにすれば宜しいでしょうか?
アドバイス、参考になるサイト等あれば、教えて頂けないでしょうか。
宜しくお願い致します。

例@)
tab2押下_データ表示→tab2押下_処理を行わない

例A)
tab2押下_データ表示→tab3押下_データ表示→tab3押下_処理を行わない

---------------------|
| tab1 | tab2 | tab3 |
---------------------------|
| データ |
|--------------------------|
| データ |
|--------------------------|
| データ |
|--------------------------|
■No28500に返信(talmanさんの記事)

Dictionaryとか単純にboolean配列でもいいかもしれないが読み込んだとこをTrueとして保存して画面表示中は2度目以降読まなければいいんじゃないかな?連続でなければ読みたい必要性はありますか?必要性があるなら前回読み込んだキーを保存して同じキーでは読まないとすればよいかと思います。
■No28501に返信(shuさんの記事)
> ■No28500に返信(talmanさんの記事)
>
> Dictionaryとか単純にboolean配列でもいいかもしれないが読み込んだとこをTrueとして保存して画面表示中は2度目以降読まなければいいんじゃないかな?連続でなければ読みたい必要性はありますか?必要性があるなら前回読み込んだキーを保存して同じキーでは読まないとすればよいかと思います。

早速の、ご回答ありがとうございます。
なんとなくイメージがわきました!
ざっくりですが、イベント中、キーとしているtabのnameをDictionaryで持たして、
その後の判定に用いたいと思います。

Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add(tabControl1.SelectedTab.Name, tabControl1.SelectedTab.Name);
if (!(tabControl1.SelectedTab.Name.Equals(tabControl1.SelectedTab.Name)))
{
処理
}

また、調べたところ、以下のように、イベントを起こさない方法もあるそうですが、今回のようなパターンで使えるようでしたら、アドバイスを頂けますでしょうか?
tabControl1.Click -= new EventHandler(TabControl_Click);

以上、宜しくお願い致します。
■No28502に返信(talmanさんの記事)

> tabControl1.Click -= new EventHandler(TabControl_Click);
この処理をするとクリックでTabControl_Clickを処理するのをやめるという
ことになってしまうので他のタブをクリックしても処理が行われなくなってしまいます。今回の場合には難しいかと思います。
■No28503に返信(shuさんの記事)
> ■No28502に返信(talmanさんの記事)
>
>>tabControl1.Click -= new EventHandler(TabControl_Click);
> この処理をするとクリックでTabControl_Clickを処理するのをやめるという
> ことになってしまうので他のタブをクリックしても処理が行われなくなってしまいます。今回の場合には難しいかと思います。

了解致しました。
Dictionary等に、キーを持たせて判定したいと思います。
コーディングが完了したら、再度判定処理を記事に載せたいと思います。
お忙しいところ、ありがとうございました!
■No28504に返信(talmanさんの記事)
> ■No28503に返信(shuさんの記事)
>>■No28502に返信(talmanさんの記事)
>>
> >>tabControl1.Click -= new EventHandler(TabControl_Click);
>>この処理をするとクリックでTabControl_Clickを処理するのをやめるという
>>ことになってしまうので他のタブをクリックしても処理が行われなくなってしまいます。今回の場合には難しいかと思います。
>
> 了解致しました。
> Dictionary等に、キーを持たせて判定したいと思います。
> コーディングが完了したら、再度判定処理を記事に載せたいと思います。
> お忙しいところ、ありがとうございました!

お疲れ様です。
参考にさせて頂いた考え方で、以下の様に実装し、処理を行うことが出来ました。
Tabを押下される度に、キー情報の上書きを行いたいので、
Dictionary、Hashtableを使用せずに、Stringにてキーを保持しました。


Formのメンバ変数にクリックされたキーを格納する以下を宣言
string clickKey = null;

キーとなるTabContorolの情報を格納(Nameには、TabControlが一意になるキー情報を持っています)
clickKey = tabControl1.SelectedTab.Name;


TabControlクリック時のイベント
private void TabControl_Click(object sender, EventArgs e)
{
//一度押下されたTabControlはデータの取得を行わない
if (!(clickKey.Equals(tabControl1.SelectedTab.Name)))
{
MessageBox.Show(tabControl1.SelectedTab.Name);
}
//押下されたTabControlのキーを格納
clickKey = tabControl1.SelectedTab.Name;
}

shuさん、ありがとうございました、また宜しくお願い致します!
■No28500に返信(talmanさんの記事)
> 現状の作りですと、Tabを押下されるたびに、イベントが走ってしまいます。
> 一回イベントが走ったTabは他のTabが押下された後でないと、
> イベント、処理を起こさない様にする為には、どのようにすれば宜しいでしょうか?

他の TabPage が選択された後なら OK であれば、単純に Selecting イベントなどで、同一の TabPage なら処理しないようガード句を置くだけでも良いような...
■No28506に返信(じゃんぬねっとさんの記事)
> ■No28500に返信(talmanさんの記事)
>>現状の作りですと、Tabを押下されるたびに、イベントが走ってしまいます。
>>一回イベントが走ったTabは他のTabが押下された後でないと、
>>イベント、処理を起こさない様にする為には、どのようにすれば宜しいでしょうか?
>
> 他の TabPage が選択された後なら OK であれば、単純に Selecting イベントなどで、同一の TabPage なら処理しないようガード句を置くだけでも良いような...

じゃんぬさん、ご回答ありがとうございます。

以下さいとを参考にして、
http://dobon.net/vb/dotnet/control/tabdisabledpage.html

「this.tabControl1.Click += new EventHandler(TabControl1_Selecting);」
としてみたのですが、「デリゲート 'System.EventHandler' に一致する 'TabControl1_Selecting' のオーバーロードはありません。」
となってしまいます。
クリックイベントに紐付ける感じでは使えないのでしょうか?
大変申し訳ないのですが、もう少し詳しい感じで教えて頂けないでしょうか。
宜しくお願い致します。
■No28507に返信(talmanさんの記事)

> 以下さいとを参考にして、
> http://dobon.net/vb/dotnet/control/tabdisabledpage.html
>
> 「this.tabControl1.Click += new EventHandler(TabControl1_Selecting);」
> としてみたのですが、「デリゲート 'System.EventHandler' に一致する 'TabControl1_Selecting' のオーバーロードはありません。」
> となってしまいます。
> クリックイベントに紐付ける感じでは使えないのでしょうか?
SelectingイベントだからClickではなくてSelectingに+=しないと駄目です。
■No28508に返信(shuさんの記事)
> ■No28507に返信(talmanさんの記事)
>
>>以下さいとを参考にして、
>>http://dobon.net/vb/dotnet/control/tabdisabledpage.html
>>
>>「this.tabControl1.Click += new EventHandler(TabControl1_Selecting);」
>>としてみたのですが、「デリゲート 'System.EventHandler' に一致する 'TabControl1_Selecting' のオーバーロードはありません。」
>>となってしまいます。
>>クリックイベントに紐付ける感じでは使えないのでしょうか?
> SelectingイベントだからClickではなくてSelectingに+=しないと駄目です。
>
>

shu 軍団さん、ご回答ありがとうございます。
tabControl1.Selectingとして、イベントを追加することができました。
Selectingを使用して、処理を実装してみます!
■No28509に返信(talmanさんの記事)
> ■No28508に返信(shuさんの記事)
>>■No28507に返信(talmanさんの記事)
>>
> >>以下さいとを参考にして、
> >>http://dobon.net/vb/dotnet/control/tabdisabledpage.html
> >>
> >>「this.tabControl1.Click += new EventHandler(TabControl1_Selecting);」
> >>としてみたのですが、「デリゲート 'System.EventHandler' に一致する 'TabControl1_Selecting' のオーバーロードはありません。」
> >>となってしまいます。
> >>クリックイベントに紐付ける感じでは使えないのでしょうか?
>>SelectingイベントだからClickではなくてSelectingに+=しないと駄目です。
>>
>>
>
> shu 軍団さん、ご回答ありがとうございます。
> tabControl1.Selectingとして、イベントを追加することができました。
> Selectingを使用して、処理を実装してみます!
>
Tabを初回クリックをした際は、Selectingイベントが実行されます。
再度同じTabをクリックすると、Clickイベントは実行されるのですが、
Selectingイベントは実行されません。
Selectingイベントは、初回イベントのみ処理する、機能という認識で宜しいのでしょうか?
以下を確認したのですが、良くわからなくて...
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.tabcontrol.selecting(v=vs.80).aspx

宜しければ、ご回答のほど、よろしくお願い致します。
■No28510に返信(talmanさんの記事)
> ■No28509に返信(talmanさんの記事)
>>■No28508に返信(shuさんの記事)
> >>■No28507に返信(talmanさんの記事)
> >>
>>>>以下さいとを参考にして、
>>>>http://dobon.net/vb/dotnet/control/tabdisabledpage.html
>>>>
>>>>「this.tabControl1.Click += new EventHandler(TabControl1_Selecting);」
>>>>としてみたのですが、「デリゲート 'System.EventHandler' に一致する 'TabControl1_Selecting' のオーバーロードはありません。」
>>>>となってしまいます。
>>>>クリックイベントに紐付ける感じでは使えないのでしょうか?
> >>SelectingイベントだからClickではなくてSelectingに+=しないと駄目です。
> >>
> >>
>>
>>shu 軍団さん、ご回答ありがとうございます。
>>tabControl1.Selectingとして、イベントを追加することができました。
>>Selectingを使用して、処理を実装してみます!
>>
> Tabを初回クリックをした際は、Selectingイベントが実行されます。
> 再度同じTabをクリックすると、Clickイベントは実行されるのですが、
> Selectingイベントは実行されません。
> Selectingイベントは、初回イベントのみ処理する、機能という認識で宜しいのでしょうか?
> 以下を確認したのですが、良くわからなくて...
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.tabcontrol.selecting(v=vs.80).aspx
>
> 宜しければ、ご回答のほど、よろしくお願い致します。
>
>
>

少々脱線してしまいましたが、本来の質問は解決できたので、解決済みとさせて頂きます。
ご回答をくれたみなさま、ありがとうございました!
また宜しくお願い致します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板